EventBus工作原理

以下总结转自:EventBus源码研读

EventBus工作原理

最后我们再来从设计者的角度看一看EventBus的工作原理。

订阅的逻辑

1、首先是调用register()方法注册一个订阅者A。

2、遍历这个订阅者A的全部以onEvent开头的订阅方法。

3、将A订阅的所有事件分别作为 key,所有能响应 key 事件的订阅者的集合作为 value,存入 Map<事件,List<订阅这个事件的订阅者>>

4、以A的类名为 key,所有 onEvent 参数类型的类名组成的集合为 value,存入 Map<订阅者,List<订阅的事件>>。

4.1、如果是订阅了粘滞事件的订阅者,从粘滞事件缓存区获取之前发送过的粘滞事件,响应这些粘滞事件。

发送事件的逻辑

1、取当前线程的发送事件封装数据,并从封装的数据中拿到发送事件的事件队列。

2、将要发送的事件加入到事件队列中去。

3、循环,每次发送队列中的一条事件给所有订阅了这个事件的订阅者。

3.1、如果是子事件可以响应父事件的事件模式,需要先将这个事件的所有父类、接口、父类的接口、父类接口的父类都找到,并让订阅了这些父类信息的订阅者也都响应这条事件。

响应事件的逻辑

1、发送事件处理完成后会将事件交给负责响应的逻辑部分。

2、首先判断时间的响应模式,响应模式分为四种:

PostThread在哪个线程调用的post()方法,就在哪个线程执行响应方法。

MainThread无论是在哪个线程调用的post()方法,最终都在主线程执行响应方法。

BackgroundThread无论是在哪个线程调用的post()方法,最终都在后台线程执行响应方法。(串行执行,一次只执行一个任务,其他任务在队列中处于等待状态)

Async无论是在哪个线程调用的post()方法,最终都在后台线程执行响应方法。(并行执行,只要有任务就开一个线程让他执行)

取消注册的逻辑

1、首先是调用unregister()方法拿到要取消注册的订阅者B。

2、从这个类订阅的时候存入的 Map<订阅者,List<订阅的事件>> 中,拿到这个类的订阅事件集合。

3、遍历订阅时间集合,在注册的时候存入的 Map<事件,List<订阅这个事件的订阅者>> 中将对应订阅事件的订阅者集合中的这个订阅者移除。

4、将步骤2中的 Map<订阅者,List<订阅的事件>> 中这个订阅者相关的 Entry 移除。

工作原理图示


EventBus工作原理_第1张图片

你可能感兴趣的:(EventBus工作原理)