作用:解决了应用程序内各个组件或者组件和后台服务之间的通信问题
基础用法
源码分析
构造方法:使用了(dcl)确保单例,构造函数中调用了另一种构造方法,使用建造者模式–通过EventBusBuilder 来完成对EventBus的配置和构造。
订阅方法的流程
1.通过Class对象,找到订阅者的所有订阅方法(@subscribe)
2.对每个订阅方法,都需要传入订阅者和订阅方法进行注册。

订阅所做的事:
1.将Subscriptions根据eventType添加到subscriptionsByEventType(建造者中的一个成分)中。根据subscriber,将订阅事件添加到typesBySubscriber中。
2. 对黏性事件的处理
事件的发送(post函数的源码)

- 获取到PostingThreadState对象,PostingThreadState保存着事件队列和线程状态信息
从PostingThreadState对象中取出事件队列,然后再将当前的事件插入到事件队列当中
将队列中的事件依次交由postSingleEvent方法进行处理,并移除该事件 - eventInheritance表示是否向上查找事件的父类,它的默认值为true,可以通过在EventBusBuilder中来进行配置。
当eventInheritance为true时,则通过lookupAllEventTypes找到所有的父类事件并存在List中,
然后通过postSingleEventForEventType方法对事件逐一处理。 - 取出该事件对应的Subscription集合(能够知道那些组件订阅了)并遍历该集合将事件event和对应Subscription传递到 postToSubscription方法中对事件进行处理
- 假如 线程模式是MAIN,提交事件的线程是主线程的话则通过反射,直接运行订阅的方法,如果不是主线程,我们需要mainThreadPoster将我们的订阅事件入队列,mainThreadPoster是HandlerPoster类型的继承自Handler,通过Handler将订阅方法切换到主线程执行。
取消注册

总结
主要是通过EventBus对象中的两个互为key的map来完成这个逻辑
核心架构

使用观察者模式来进行设计
928

被折叠的 条评论
为什么被折叠?



