美文网首页
EventBus工作原理

EventBus工作原理

作者: 买酱油 | 来源:发表于2017-02-04 09:13 被阅读0次

    以下总结转自: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工作原理

          本文链接:https://www.haomeiwen.com/subject/tksjittx.html