1. 程式人生 > >瞭解EventBus 3.0 (二)-傳送事件

瞭解EventBus 3.0 (二)-傳送事件

雖然我在這裡寫下Eventbus,但是,還是覺得老司機教你 “飆” EventBus 3 才是很完美的文章。

1. 我們能傳送哪些事件

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

粘性事件,當有訂閱者訂閱的時候,會從粘性事件列表中取出最後(最新)的事件,傳送出去。

2. EventBus#post

這裡寫圖片描述

  • currentPostingThreadState是ThreadLocal
  • PostingThreadState 一個狀態類,程式碼如下:
    final static class PostingThreadState {
        final
List<Object> eventQueue = new ArrayList<Object>(); 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傳送事件到這裡就完了。