-
概念
- Eventbus是一个专门为Android平台优化定制的事件总线函数库,事件总线,继承自观察者模式,也是基于发布订阅的机制来实现事件的发送与接收的
-
基本用法
- 定义一个事件类
MessageEvent
- 定义一个订阅方法,使用
@Subscribe
指定订阅方法所在线程 - 注册和反注册订阅方法
- 发送事件
- 定义一个事件类
-
源码详解
-
重要成员变量
-
subscriptionsByEventType
:以event事件为key,以订阅者列表为value -
typesBySubscriber
:订阅者集合,以订阅者类为key,以订阅者所有event事件列表为value -
stickyEvents
:保存的是粘性事件 HandlerPoster
BackgroundPoster
AsyncPoster
-
-
@Subscribe
的注解- 当我们指定订阅方法的时候,会在方法上加上注解
@Documented //命名为 java doc 文档 @Retention(RetentionPolicy.RUNTIME) //指定在运行时有效,即在运行时能保持这个 Subscribe @Target({ElementType.METHOD}) //指定类型为 METHOD,表名用来描述方法 public @interface Subscribe { //指定线程模式,可以指定在 Subscribe 中接收的 Event 所处的线程 ThreadMode threadMode() default ThreadMode.POSTING; boolean sticky() default false; int priority() default 0; }
- 源码流程
-
Eventbus创建
- 单例模式、建造者模式
-
Regitster注册
- 通过反射获取到订阅者的 Class 对象
- 通过 Class 对象找到对应的订阅者方法集合
- 首先从缓存取出subscriberMethods,如果有则直接返回该方法列表(
ConcurrentHashMap
) - 根据是否忽略生成 index标记位(优化,
EventBusAnnotationProcessor
编译时期生成方法索引,默认false) - 忽略通过反射
findUsingReflection()
- 创建并初始化 FindState 对象(封装了所有的订阅者和订阅方法的集合)
- 使用反射的方式获取单个类的订阅方法
- 忽略非 public 和 static 的方法
- 筛选只有一个参数、有 Subscribe 的注解的订阅方法
- 检查 eventType 决定是否订阅,不能有多个eventType 相同的订阅方法
- 将订阅方法加入
SubscriberMethod
- 不忽略通过
findUsingInfo
- 首先从缓存取出subscriberMethods,如果有则直接返回该方法列表(
-
subscribe ()
遍历订阅者方法集合,将订阅者和订阅者方法订阅起来- 判断是否订阅过事件,如果该
newSubscription
(封装订阅者和订阅方法信息)已经被订阅过,抛出异常 - 按照优先级插入
subscriptions
(typesBySubscriber value
的list
) - 判断是否为粘性事件,是的话考虑是否继承关系
- 发送粘性事件给
newSubscription
- 判断是否订阅过事件,如果该
-
Post分发
- 获取当前线程的 posting 状态
- 获取当前事件队列
- 将事件添加进当前线程的事件队列
-
postSingleEvent()
不断从队列获取事件进行分发- 依次遍历订阅者
-
postToSubscription()
根据threadMode进行不同Poster分发 -
invokeSubscriber()
最终订阅者接收到了事件,反射调用订阅方法
-
UnRegitster反注册
- 根据
typesBySubscriber
逐个取消订阅者所有订阅事件
- 根据
-
-
Android开源框架如何说-EventBus3
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 前边文章主要跟大家大概讲了下EventBus的用法和注解,接下来则是从源码角度来看EventBus的内部处理 Ev...
- Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...