EventBus源码分析(一):入口函数提纲挈领(2.4版本)
EventBus源码分析(二):register方法保存事件的订阅者列表(2.4版本)
EventBus源码分析(三):post方法发布事件【获取事件的所有订阅者,反射调用订阅者事件处理方法】(2.4版本)
EventBus源码分析(四):线程模型分析(2.4版本)
EventBus源码解读详细注释(1)register的幕后黑手
EventBus源码解读详细注释(2)MainThread线程模型分析
EventBus源码解读详细注释(3)PostThread、MainThread、BackgroundThread、Async四种线程模式的区别
EventBus源码解读详细注释(4)register时刷新的两个map
EventBus源码解读详细注释(5)事件消息继承性分析 eventInheritance含义
EventBus源码解读详细注释(6)从事件发布到事件处理,究竟发生了什么!
EventBus有四种线程模型
- PostThread模式不需线程切换,直接在发布者线程进行事件处理。
- MainThread模式分类讨论:发布者线程是主线程则直接调用事件处理方法,否则通过Handler进行线程切换,切换到主线程处理事件,该模式下事件是串行执行的。
- BackgroundThread模式分类讨论:发布者线程不是主线程则在发布者线程直接处理事件,否则线程切换至线程池处理,所有该线程模式下的事件会在线程池中用一个线程排队串行处理(直到队列里边的事件处理完之后又有新的事件发布出来才会向线程池获取一个新的线程)。
- Async模式不关心发布者线程直接在线程池中开辟一个新的线程处理事件,和BackgroundThread模式不同的是,该线程模式的每个事件都是在线程池中开辟一个线程处理,事件之间并发处理,并不排队。
PendingPostQueue待处理事件队列
在分析线程模型之前,先看下各种线程模型都用到的数据结构PendingPostQueue,PendingPostQueue顾名思义是一个队列,对待处理事件进行了排队。
final class PendingPostQueue {
private PendingPost head;
private PendingPost tail;
...
PendingPostQueue维护了一个队列链表,队列的数据是PendingPost,PendingPost随后分析。
既然PendingPostQueue是一个队列,那么肯定提供了出队列和入队列的操作。
synchronized void enqueue(PendingPost pendingPost) {
if (pendingPost == null) {
throw new NullPointerException("null cannot be enqueued");
}
if (tail != null) {
tail.next = pendingPost;
tail = pendingPost;
} else if (head == null) {
head = tail = pendingPost;
} else {
throw new IllegalStateException("Head present, but no tail");
}
notifyAll();
}
可见入队列操作就是通过队尾指针操作将新数据插入队列尾部。如果队尾tail不为null,说明队列不空,将新数据作为新的队尾,修改队尾指针,如果队尾tail和队首he