静态数组保存 FindState
避免重复创建:
网络异常,图片无法展示
|
上面循环递归订阅类及其父类(直到父类java、javax、android.开头为止),递归同时调用 findUsingReflectionInSingleClass()
方法:
网络异常,图片无法展示
|
findSubscriberMethods()通过读取编译时生成文件或反射获得订阅类中所有的订阅方法数据,接着看下subscribe() 订阅方法又做了啥:
网络异常,图片无法展示
|
所以这一步的核心逻辑是:
获取所有订阅了此事件类型的订阅者信息 → 根据优先级将订阅者信息插入订阅者队列 → 获得当前订阅者所有事件队列,将当前事件添加其中方便后续取消订阅 → 如果是粘性事件,直接post此事件给当前订阅者。
③ 订阅者取消订阅
直接跟 unregister()
方法:
网络异常,图片无法展示
|
跟下 unsubscribeByEventType()
,取消订阅还是很简单的~
网络异常,图片无法展示
|
④ 发布普通事件
跟下 post()
方法:
网络异常,图片无法展示
|
这里的currentPostingThreadState是一个 ThreadLocal<PostingThreadState>
,线程内部存储类,可指定线程存取数据,跟下 postSingleEvent()
:
网络异常,图片无法展示
|
是否考虑事件继承,最后都是走的 postSingleEventForEventType(),跟下:
网络异常,图片无法展示
|
跟下 postToSubscription()
:
网络异常,图片无法展示
|
以上就是EventBus对于普通事件的分发,根据订阅事件的线程模式,执行回调的过程。
⑤ 发布粘性(Sticky)事件
网络异常,图片无法展示
|
相比普通事件就多了一步把事件放到粘性集合里的操作,粘性事件分发的话在上面的subscribe()中已经提到了:
网络异常,图片无法展示
|
以上就是EventBus主要原理,不是标准的观察者模式实现,但整体就是一个发布/订阅的框架,也拥有观察者模式的优点,如:发布者和订阅者解耦。