標籤:
1. 功能介紹
AndroidEventBus是一個Android平台的事件匯流排庫, 它簡化了Activity、Fragment、Service等組件或者對象之間的互動,很大程度上降低了它們之間的耦合,使得我們的代碼更加簡潔,耦合性更低,提升我們的代碼品質。
AndroidEventBus吸收了greenrobot的EventBus以及square的otto的優點,並在此基礎上做出了相應的改進,使得事件匯流排架構更適合使用者的使用習慣,也使得事件的投遞更加的精準、靈活。
與EventBus、otto的區別
| 名稱 |
訂閱函數是否可執行在其他線程 |
特點 |
| greenrobot的EventBus |
是 |
使用name pattern模式,效率高,但使用不方便。 |
| square的otto |
否 |
使用註解,使用方便,但效率比不了EventBus。 |
| AndroidEventBus |
是 |
使用註解,使用方便,但效率比不上EventBus。訂閱函數支援tag(類似廣播接收器的Action)使得事件的投遞更加準確,能適應更多使用情境。 |
更多細節請參考AndroidEventBus、Android事件匯流排 ( AndroidEventBus ) 開源庫發布。
2. 總體設計
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. 流程圖註冊接收者簡單流程圖
發布事件簡單流程圖
4. 詳細設計4.1 核心類詳細介紹
- EventBus : 事件匯流排核心類,封裝了訂閱對象的註冊、登出以及事件的發布、投遞等,是事件匯流排最核心的類;
- EventType : 事件類型對象,由事件Class類型與接收函數tag組成,用於標識一個事件類型;
- Subscriber : Subscriber註解,作用於函數上,用於標識這個函數是一個事件訂閱函數;
- ThreadMode : 接收函數的執行執行緒模式,預設執行在UI線程;
- Subscription : 一個訂閱對象的封裝類,含有接收對象、目標方法、執行緒模式;
- TargetMethod : 目標訂閱方法;
- SubsciberMethodHunter : 訂閱者法尋找輔助類,根據事件對象尋找符合要求的EventType列表,EventBus根據這個返回的列表來投遞事件給訂閱者;
- EventHandler : 事件處理器;
- DefaultEventHandler : 預設的事件處理器,即事件在哪個線程投遞,則處理事件也在該線程;
- UIThreadEventHandler : 事件處理在UI線程的Handler;
- AsyncEventHandler : 事件處理在一個獨立線程的Handler;
- MatchPolicy : 事件匹配策略介面;
- DefaultMatchPolicy : 預設的匹配策略,發布事件時,EventBus會尋找參數是該事件父類的函數,並且構造對應的EventType;
- StrictMatchPolicy : 嚴格的匹配策略,發布事件時只尋找參數類型完全符合的訂閱函數;
4.2 類別關係圖
5. 雜談
事件匯流排的基本結構和設計都是類似的,只是大家在各種feature之間做了取捨或者增強了某些功能,使之能夠滿足使用者的具體需求。幾個事件匯流排庫的基本特點在章節1中已經粗略給出。大家可以根據自己的需求進行選擇。
本篇文章我們對AndroidEventBus做了一個簡介,在後續的文章中我們再進行詳細介紹,敬請期待。
來自為知筆記(Wiz)
android事件匯流排(eventbus)設計與實現