分析EventBus是如何发送事件的,入口就是EventBus的post方法内
以上代码可以拆解以下几个步骤:
1:从TheadLocal修饰的对象内取出1个PostingTheadState,该对象保存了当前线程的状态
2:从PostTheadState对象内取出当前事件的队列,并将要发送的事件添加到队列内
3:检查状态,循环从队列中取出事件进行发送
4:复位PostTheadState状态
流程进入postSingleEvent方法内,接着往下看
该流程也可拆分以下步骤:
1:查找跟要发送的事件相关的类以及接口,存储在缓存中
2:依次发送事件
3:如果无订阅方法,发送1个默认事件
方法主要还是进入postSingleEventForEventType内;
继续拆分:
1:通过要发送的事件查询他的全部订阅者信息
2:循环遍历每个订阅者,执行postToSubscription
3:修改PostingThreadState状态信息
进入postToSubscription
该方法是发送事件的重点,前面的操作为事件的发送进行铺垫;
讲到该方法,就得了解下TheadMode这个对象了,它是EventBus中的1个枚举类,包含以下五种状态
POSTING 默认订阅者和发布者同个线程
MAIN 主线程订阅
MAIN_ORDERED 主线程订阅
BACKGROUND, 后台订阅
ASYNC 异步订阅
TheadMode的设置就决定了该订阅方法在哪个线程被调度。
1:POSTING方式 ,直接调用invokeSubscriber反射调用触发订阅方法
2:MAIN方式,判断发布者所在线程,如果是在主线程则直接调用invokeSubscriber反射调用触发订阅方法,否则通过mainThreadPoster调度来触发
后面3,4,5原理逻辑 基本一致,只是Poster不一样;
逐个分析下不同的Poster;
EventBus的成员变量就有3个不同的Poster, 并且在EventBus初始化的时候就初始化了
MainThreadPoster最终创建的是HandlerPoster
分发的时候执行的是mainThreadPoster.enqueue,
在PendingPost中取出1个事件添加到队列中,sendMessage触发Handler的handlerMessage方法
handleMessage会开始1个死循环,不断的从队列中取出Post事件来执行,取出事件后反射调用触发订阅方法;
循环退出的条件:1队列中无post事件,2超过最大事件限制
BackgroundPoster实现的是Runnable接口 是一个线程类
enqueue也是从PendingPost中取出1个PendingPost放入队列中,调用线程池开启线程,回调到run方法,接着看run方法
run方法内也是1个死循环,不断的从队列内取出Post事件进行处理,取出事件后调用invoke方法反射调用触发订阅方法;
AsyncPoster
AsyncPoster实现的也是Runnable接口,但是run方法只取出1个进行分发,因为每次都是订阅的都是在1个新的线程,不会出现互相卡顿的现象;