虽然我在这里写下Eventbus,但是,还是觉得老司机教你 “飙” EventBus 3 才是很完美的文章。
1. 我们能发送哪些事件
- post发送普通事件
- postSticky 发送粘性事件
粘性事件,当有订阅者订阅的时候,会从粘性事件列表中取出最后(最新)的事件,发送出去。
2. EventBus#post

- currentPostingThreadState是ThreadLocal
- PostingThreadState 一个状态类,代码如下:
final static class PostingThreadState {
final List eventQueue = new ArrayList();
boolean isPosting;
boolean isMainThread;
Subscription subscription;
Object event;
boolean canceled;
}
- 先获取事件list,然后将当前event放进去
- 如果不是在posting状态,
- 进入发送状态,设置是否在主线程。
- 当eventQueue不为空的话,就一直postSingleEvent发送事件
- 重置isPosting和isMainThread
3. EventBus#postSingleEvent
该方法代码逻辑如下:
- 如果支持事件继承的话
- 查询所有的事件类型
- 遍历,postSingleEventForEventType发送事件,并返回发送结果,并且|=,
- 如果不支持事件继承的话,直接发送事件
- 如果subscriptionFound,也就是没找到订阅关系,相当于发送失败,则发送一个NoSubscriberEvent(无订阅事件)
4. EventBus#postSingleEventForEventType

- 从subscriptionsByEventType中,找到subscriptions 订阅关系
- 遍历订阅关系,postToSubscription真正的发送事件
- 返回结果
而postToSubscription方法就根据不同的threadMode,选择反射调用或者加入队列,相关代码在上篇文章看到过。

5. EventBus#postSticky
postSticky的相关方法就简单多了,将事件加入stickyEvents中,然后post出去。
到这里,EeventBus发送事件到这里就完了。