事件總線框架---Otto

我們假設這樣一種業務場景,現在在做一款及時聊天應用,我們在聊天頁面進行收發信息,同時也要實時更新前一頁面的聊天記錄,這時我們該如何去實現?說說我以前的實現策略,我使用的是廣播接收器BroadCastReceiver,在接收和發送消息的時候就不停去發送廣播,然後在需要實時更新的地方進行接收更新。實現的思想比較簡單,也不存在代碼上的耦合問題,但是有個弊端。弊端就是需要去在很多地方實現BroadCastRecevier,代碼雖不算冗餘,但比較多,看起來很是不爽。

今天爲大家介紹的Otto,就能徹底解決代碼體積的問題。Otto是一款目前比較流行事件總線框架,旨在保持應用各頁面和模塊之間通信高效的前提下,對應用進行解耦。Otto的使用很簡單,源碼也只就9個類,幾千行代碼,開放出來的api也間接明瞭。Otto是基於訂閱/發佈(Subscribe/Publish)這樣一種設計模式,簡單來說,如果你想訂閱某個消息,使用@Subcribe註解即可進行接收,同時使用

Bus.post(Object obj)進行消息的發佈,這樣的設計達到了完全的解耦。

下面分步驟爲大家簡單介紹下使用過程。

一、Bus實例化

Bus這個類是整個框架的靈魂,它負責消息的發佈和接收,整個流程都是經過這個Bus去實現的。Bus的實例化推薦使用單例,就是說整個應用內只實例化一個Bus對象,所有的消息的處理都是經過這單一的實例去實現。因爲要實現消息的接受者接收到發佈的消息,一定要經過同一個Bus對象的處理。Bus的構造器可以接收ThreadEnforcer類型的參數,ThreadEnforcer其實是一個接口,它自身有兩個實現,分別表示Bus運行在Main Thread中還是異步線程中。

二、註冊和解綁Bus

根據具體的業務需求進行Bus的註冊和解綁,對於android中的組件,一般是基於生命週期方法中去實現;同時如果是任意你自定義的類中都可以進行。下面展示的是在Activity和Fragment裏面實現。

三、消息的發佈

發佈消息是整個框架中最重要的部分,它允許你告訴所有的訂閱者一個事件已經觸發。任何一個類的實例對象都可以通過總線Bus去發佈,同時也只能被訂閱這種對象的接受者所接收。下面展示的是通過Bus去發佈一個消息,消息的內容是LocationChangeEvent,所以LocationChangeEvent的接受者都能接收到此發佈的消息。注意的是,發佈消息只能一個Object對象。

四、消息的訂閱

消息的訂閱和發佈之前都要在當前的類中進行Bus的註冊。訂閱是對消息發佈的補充,當消息發佈的事件調用之後,對應的消息訂閱者就能立即接收到此消息。實現訂閱功能是通過自定義方法實現的,方法的名稱可以隨意,同時還得需要滿足三個條件。

1、方法前使用@Subscribe註解

2、訪問修飾符爲public

3、單一參數,根據你想訂閱的消息進行設置

注:使用之前,記得進行註冊;使用完畢,記得釋放。

五、消息的produce

當訂閱者註冊完畢,針對特定的消息,通常也需要獲取當前已知的值。這個時候,就需要用到produce。同樣的使用produce的方法名稱可以隨意,同時有三點需要注意。

1、方法前使用@produce註解

2、訪問修飾符爲public

3、無參,返回值是基於訂閱者參數類型

好了,Otto的使用就是這些了。快去重構代碼,擺脫無盡的廣播吧!

當然Otto的缺點也是有的,要實現上述訂閱/發佈模型的功能,付出的代價就是對各個註冊Bus的類進行反射。如果大量的使用的情況下,對應用的性能多少有點副影響。


Otto源碼和Demo地址:https://github.com/square/otto

如果覺得對你有所幫助,歡迎大家訂閱我的微信公衆賬號——Android乾貨分享(ID:android_share)。下面是微信的二維碼,爲你提供及時高質的Android乾貨。

技術交流QQ羣:318588906,歡迎大家加羣,共同探討下Android和Java技術,一起壯大我們的微信乾貨分享社區。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章