了解EventBus 3.0 (二)-发送事件

虽然我在这里写下Eventbus,但是,还是觉得老司机教你 “飙” EventBus 3 才是很完美的文章。

1. 我们能发送哪些事件

  • post发送普通事件
  • postSticky 发送粘性事件

粘性事件,当有订阅者订阅的时候,会从粘性事件列表中取出最后(最新)的事件,发送出去。

2. EventBus#post

了解EventBus 3.0 (二)-发送事件_第1张图片

  • 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

了解EventBus 3.0 (二)-发送事件_第2张图片
该方法代码逻辑如下:

  • 如果支持事件继承的话
    • 查询所有的事件类型
    • 遍历,postSingleEventForEventType发送事件,并返回发送结果,并且|=,
  • 如果不支持事件继承的话,直接发送事件
  • 如果subscriptionFound,也就是没找到订阅关系,相当于发送失败,则发送一个NoSubscriberEvent(无订阅事件)

4. EventBus#postSingleEventForEventType

了解EventBus 3.0 (二)-发送事件_第3张图片

  • 从subscriptionsByEventType中,找到subscriptions 订阅关系
  • 遍历订阅关系,postToSubscription真正的发送事件
  • 返回结果

而postToSubscription方法就根据不同的threadMode,选择反射调用或者加入队列,相关代码在上篇文章看到过。

了解EventBus 3.0 (二)-发送事件_第4张图片

5. EventBus#postSticky

postSticky的相关方法就简单多了,将事件加入stickyEvents中,然后post出去。


到这里,EeventBus发送事件到这里就完了。

你可能感兴趣的:(Android)