咱們假設這樣一種業務場景,如今在作一款及時聊天應用,咱們在聊天頁面進行收發信息,同時也要實時更新前一頁面的聊天記錄,這時咱們該如何去實現?說說我之前的實現策略,我使用的是廣播接收器BroadCastReceiver,在接收和發送消息的時候就不停去發送廣播,而後在須要實時更新的地方進行接收更新。實現的思想比較簡單,也不存在代碼上的耦合問題,可是有個弊端。弊端就是須要去在不少地方實現BroadCastRecevier,代碼雖不算冗餘,但比較多,看起來非常不爽。android
今天爲你們介紹的Otto,就能完全解決代碼體積的問題。Otto是一款目前比較流行事件總線框架,旨在保持應用各頁面和模塊之間通訊高效的前提下,對應用進行解耦。Otto的使用很簡單,源碼也只就9個類,幾千行代碼,開放出來的api也間接明瞭。Otto是基於訂閱/發佈(Subscribe/Publish)這樣一種設計模式,簡單來講,若是你想訂閱某個消息,使用@Subcribe註解便可進行接收,同時使用git
Bus.post(Object obj)進行消息的發佈,這樣的設計達到了徹底的解耦。github
下面分步驟爲你們簡單介紹下使用過程。設計模式
1、Bus實例化api
Bus這個類是整個框架的靈魂,它負責消息的發佈和接收,整個流程都是通過這個Bus去實現的。Bus的實例化推薦使用單例,就是說整個應用內只實例化一個Bus對象,全部的消息的處理都是通過這單一的實例去實現。由於要實現消息的接受者接收到發佈的消息,必定要通過同一個Bus對象的處理。Bus的構造器能夠接收ThreadEnforcer類型的參數,ThreadEnforcer實際上是一個接口,它自身有兩個實現,分別表示Bus運行在Main Thread中仍是異步線程中。微信
2、註冊和解綁Bus框架
根據具體的業務需求進行Bus的註冊和解綁,對於android中的組件,通常是基於生命週期方法中去實現;同時若是是任意你自定義的類中均可以進行。下面展現的是在Activity和Fragment裏面實現。異步
三、消息的發佈post
發佈消息是整個框架中最重要的部分,它容許你告訴全部的訂閱者一個事件已經觸發。任何一個類的實例對象均可以經過總線Bus去發佈,同時也只能被訂閱這種對象的接受者所接收。下面展現的是經過Bus去發佈一個消息,消息的內容是LocationChangeEvent,因此LocationChangeEvent的接受者都能接收到此發佈的消息。注意的是,發佈消息只能一個Object對象。性能
4、消息的訂閱
消息的訂閱和發佈以前都要在當前的類中進行Bus的註冊。訂閱是對消息發佈的補充,當消息發佈的事件調用以後,對應的消息訂閱者就能當即接收到此消息。實現訂閱功能是經過自定義方法實現的,方法的名稱能夠隨意,同時還得須要知足三個條件。
一、方法前使用@Subscribe註解
二、訪問修飾符爲public
三、單一參數,根據你想訂閱的消息進行設置
注:使用以前,記得進行註冊;使用完畢,記得釋放。
5、消息的produce
當訂閱者註冊完畢,針對特定的消息,一般也須要獲取當前已知的值。這個時候,就須要用到produce。一樣的使用produce的方法名稱能夠隨意,同時有三點須要注意。
一、方法前使用@produce註解
二、訪問修飾符爲public
三、無參,返回值是基於訂閱者參數類型
好了,Otto的使用就是這些了。快去重構代碼,擺脫無盡的廣播吧!
固然Otto的缺點也是有的,要實現上述訂閱/發佈模型的功能,付出的代價就是對各個註冊Bus的類進行反射。若是大量的使用的狀況下,對應用的性能多少有點副影響。
Otto源碼和Demo地址:https://github.com/square/otto
若是以爲對你有所幫助,歡迎你們訂閱個人微信公衆帳號——Android乾貨分享(ID:android_share)。下面是微信的二維碼,爲你提供及時高質的Android乾貨。
技術交流QQ羣:318588906,歡迎你們加羣,共同探討下Android和Java技術,一塊兒壯大咱們的微信乾貨分享社區。