AndroidEventBus (事件匯流排) 的設計與實現
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. 總體設計
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組成,用於標識一個事件型別;
- Subcriber : Subcriber註解,作用於函式上,用於標識這個函式是一個事件訂閱函式;
- 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做了一個簡介,在後續的文章中我們再進行詳細介紹,敬請期待。
相關文章
- 事件匯流排的設計與實現事件
- 將Abp預設事件匯流排改造為分散式事件匯流排事件分散式
- 事件匯流排事件
- 在 .NET 中深入瞭解事件匯流排的使用與實現事件
- 事件匯流排demo事件
- javascript事件匯流排JavaScript事件
- 如何在 JavaScript 中實現 Event Bus(事件匯流排)JavaScript事件
- 如何在 pyqt 中實現全域性事件匯流排QT事件
- 實現一個事件匯流排(vue.prototype.$bus)?事件Vue
- 元件間通訊--利用mitt實現事件匯流排元件MIT事件
- Vue事件匯流排(EventBus)Vue事件
- Vue 事件中央匯流排Vue事件
- 基於事件匯流排EventBus實現郵件推送功能事件
- Flutter中的事件匯流排(EventBus)Flutter事件
- Otto事件匯流排框架的使用事件框架
- WebWorker與WebSocket實現前端訊息匯流排Web前端
- 風險洞察之事件匯流排的探索與演進事件
- SOFA 原始碼分析— 事件匯流排原始碼事件
- 比 EventBus 更高效的事件匯流排(BusUtils)事件
- 數倉實踐:匯流排矩陣架構設計矩陣架構
- 事件匯流排EventBus和觀察者模式事件模式
- 自己動手寫事件匯流排(EventBus)事件
- 事件匯流排有個 pipe 管道方法事件
- Otto - 安卓平臺上事件匯流排安卓事件
- 匯流排
- 計算機組成原理之匯流排設計計算機
- Flutter基礎-036-事件匯流排EventBusFlutter事件
- 計算匯流排頻寬
- 高吞吐量的Java事件匯流排:MBassadorJava事件
- Vue事件匯流排(EventBus)使用詳細介紹Vue事件
- EventBridge 事件匯流排及 EDA 架構解析事件架構
- Android事件匯流排還能怎麼玩?Android事件
- 前端匯流排前端
- “全”事件觸發:阿里雲函式計算與事件匯流排產品完成全面深度整合事件阿里函式
- C#使用Socket實現分散式事件匯流排,不依賴第三方MQC#分散式事件MQ
- 在vue專案中自定義事件匯流排eventHubVue事件
- 嵌入式作業6.3 CAN 匯流排程式設計程式設計
- Solon2 分散式事件匯流排的技術價值?分散式事件