EventBus源码解析-Post过程

2019-02-24  本文已影响0人  Kuma老熊头

分析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个新的线程,不会出现互相卡顿的现象;

上一篇 下一篇

猜你喜欢

热点阅读