EventBus 源码解析

192 阅读2分钟

1.注册EventBus

EventBus.getDefault().register(this);

1.1 getDefault() 双锁单例获取EventBus对象

1.2 register()

通过classs对象反射获取类中的方法 

反射获取对象类中的方法,1,首先从缓存从获取 2,如果缓存 不存在通过反射获取类中的方法,同时缓存获取的到的方法

具体注册流程

注册的核心流程,subscribe()方法主要是得到了subscriptionsByEventType、typesBySubscriber两个 HashMap。我们在发送事件的时候要用到subscriptionsByEventType,完成事件的处理。当取消 EventBus 注册的时候要用到typesBySubscriber、subscriptionsByEventType,完成相关资源的释放

2 取消注册

EventBus.getDefault().unregister(this);

2.1 获取当前注册类对象 对应的 订阅事件方法的参数类型 的集合

    遍历参数类型集合,释放之前缓存的当前类中的Subscription

3 发送事件

EventBus.getDefault().post("Hello EventBus!")

post()方法先将发送的事件保存的事件队列,然后通过循环出队列,将事件交给postSingleEvent()方法处理:

根据eventInheritance属性,决定是否向上遍历事件的父类型,然后用 postSingleEventForEventType()方法进一步处理事件

遍历发送的事件类型对应的Subscription集合,然后调用postToSubscription()方法处理事件。

5 处理事件

据订阅事件方法的线程模式、以及发送事件的线程来判断如何处理事件,至于处理方式主要有两种: 一种是在相应线程直接通过invokeSubscriber()方法,用反射来执行订阅事件的方法,这样发送出去的事件就被订阅者接收并做相应处理了

另外一种是先将事件入队列(其实底层是一个List),然后做进一步处理,我们以 mainThreadPoster.enqueue(subscription,event)为例简单的分析下,其中mainThreadPoster是HandlerPoster类的一个实例

主要就是从pendingPost中取出之前保存的event、subscription,然后用反射来执行订阅事件的方法,又回到了第一种处理方式。所以mainThreadPoster.enqueue(subscription, event)的核心就是先将将事件入队列,然后通过Handler从子线程切换到主线程中去处理事件

6 粘性事件

EventBus.getDefault().postSticky("Hello Sticky Eventbus!"); 发送事件时区分的,