-
概念
- 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
逐个取消订阅者所有订阅事件
- 根据
-
-
网友评论