瞭解EventBus 3.0 (二)-傳送事件
阿新 • • 發佈:2019-02-07
雖然我在這裡寫下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傳送事件到這裡就完了。