AndroidEventBus (事件匯流排) 的設計與實現

Mr.Simple的專欄發表於2015-04-02

1. 功能介紹

AndroidEventBus是一個Android平臺的事件匯流排庫, 它簡化了Activity、Fragment、Service等元件或者物件之間的互動,很大程度上降低了它們之間的耦合,使得我們的程式碼更加簡潔,耦合性更低,提升我們的程式碼質量。

AndroidEventBus吸收了greenrobot的EventBus以及square的otto的優點,並在此基礎上做出了相應的改進,使得事件匯流排框架更適合使用者的使用習慣,也使得事件的投遞更加的精準、靈活。

與EventBus、otto的區別

名稱 訂閱函式是否可執行在其他執行緒 特點
greenrobot的EventBus 使用name pattern模式,效率高,但使用不方便。
square的otto 使用註解,使用方便,但效率比不了EventBus。
AndroidEventBus 使用註解,使用方便,但效率比不上EventBus。訂閱函式支援tag(類似廣播接收器的Action)使得事件的投遞更加準確,能適應更多使用場景。

2. 總體設計

arch

AndroidEventBus簡約整體設計大致如上圖所示,主要分為三個部分,即EventBus、SubscriberMethodHunter、EventHandler。

EventBus負責訂閱物件與事件的管理,比如註冊、登出以及釋出事件等。在初始時將某個物件註冊到EventBus中,EventBus會遍歷該物件class中的所有方法,把引數數量為1且用了Subscriber註解標識的函式管理起來,以事件型別和訂閱函式Subscriber的tag構建一個EventType作為一種事件型別,某個事件型別對應有一個接收者列表。當有事件釋出時,EventBus會根據釋出的事件型別與tag構建EventType,然後找到對應的訂閱者列表,並且將這些事件投遞給所有訂閱者。SubscriberMethodHunter負責查詢合適的EventType,而EventHandler則負責將這些訂閱函式執行到相應的執行緒中。至此,整個事件匯流排的操作流程就完成了,當然在將Activity、Fragment等元件註冊到EventBus時,不要忘了在這些物件銷燬時將它們從EventBus中移除,即呼叫unregister方法。

3. 流程圖

註冊接收者簡單流程圖

flow

釋出事件簡單流程圖

flow

4. 詳細設計

4.1 核心類詳細介紹

  • EventBus : 事件匯流排核心類,封裝了訂閱物件的註冊、登出以及事件的釋出、投遞等,是事件匯流排最核心的類;
  • EventType : 事件型別物件,由事件Class型別與接收函式tag組成,用於標識一個事件型別;
  • Subcriber : Subcriber註解,作用於函式上,用於標識這個函式是一個事件訂閱函式;
  • ThreadMode : 接收函式的執行執行緒模型,預設執行在UI執行緒;
  • Subscription : 一個訂閱物件的封裝類,含有接收物件、目標方法、執行緒模型;
  • TargetMethod : 目標訂閱方法;
  • SubsciberMethodHunter : 訂閱方法查詢輔助類,根據事件物件查詢符合要求的EventType列表,EventBus根據這個返回的列表來投遞事件給訂閱者;
  • EventHandler : 事件處理器;
  • DefaultEventHandler : 預設的事件處理器,即事件在哪個執行緒投遞,則處理事件也在該執行緒;
  • UIThreadEventHandler : 事件處理在UI執行緒的Handler;
  • AsyncEventHandler : 事件處理在一個獨立執行緒的Handler;
  • MatchPolicy : 事件匹配策略介面;
  • DefaultMatchPolicy : 預設的匹配策略,釋出事件時,EventBus會查詢引數是該事件父類的函式,並且構造對應的EventType;
  • StrictMatchPolicy : 嚴格的匹配策略,釋出事件時只查詢引數型別完全匹配的訂閱函式;

4.2 類關係圖

uml

5. 雜談

事件匯流排的基本結構和設計都是類似的,只是大家在各種feature之間做了取捨或者增強了某些功能,使之能夠滿足使用者的具體需求。幾個事件匯流排庫的基本特點在章節1中已經粗略給出。大家可以根據自己的需求進行選擇。

本篇文章我們對AndroidEventBus做了一個簡介,在後續的文章中我們再進行詳細介紹,敬請期待。

相關文章