1. 程式人生 > >Android的EventBus 詳解(2.4及最新版3.0)[觀察者模式]

Android的EventBus 詳解(2.4及最新版3.0)[觀察者模式]

EventBus使用詳解EventBus是什麼?
EventBus是一種釋出者和訂閱者的事件分發模式。我們可以這麼理解,比如我們訂閱的Android Weekly,每當星期一0點這個時候,Android WeekLy公司
都會以郵件的形式通知我們。這裡有四個概念
1.釋出者-事件的來源者,通過它進行通知接收者或者觀察者,如我們的Android Weekly
2.接收者-監聽事件的物件,比如說訂閱了週報的我們。
3.通知事件-釋出者和接受者之前的互動。比如說Android Week
4.觸發事件-引發變化的條件,比如說時間到了。
目前有多個庫都開發了這樣的功能。比如說:Google guava開源庫,
位於com.google.common.eventbus包下面。但是guava專案比較大,比較常用在j2ee
專案內。我們在android開發中實際用的是greenrobot開發的EventBus。它有以下的優點:
方法庫較小,便於整合。guava jar2.2Mgreenrobot 54k
使用簡單
我們為什麼要使用EventBus
EventBus是徹底解耦的觀察者模式。我們常常用在物件一對多的情況,使一個物件發生改變的時候,所有依賴的物件能夠得到通知並更新。
比如我們在實際的開發中,當用戶登入了,我們多個頁面需要根據登入後的資訊更改頁面UI。這時,登入介面就是釋出者,而其他的頁面就是訂閱者。它
們都在訂閱使用者資訊變化的訊息。
再比如我們的Fragment間的通訊
如何使用EventBus
EventBus目前的最新版本是3.0,使用的最廣泛的是2.4版本。下面將分別介紹這兩個版本的用法。
EventBus 2.4.1
1.匯入EventBus,EventBus 2.4.1jar包。下載地址http://search.maven.org/
2.在需要接收事件的元件註冊為訂閱者(接收事件的頁面)。EventBus.getDefault().register(this);
3.自定義通知事件的類,我們慣例起名為XXXEvent
4.在訂閱者類中接收事件。
5.在需要傳送事件的地方EventBus.getDefault().post;
6.使用完成登出EventBus.getDefault.unregister(this);
EventBus3.0.0版本以下的接收事件方法都是才有約定好的方法進行接收。EventBus提供了以下幾個方法進行接收事件:
onEvent()執行在傳送事件的執行緒。onEventMainThread代表這個方法會在UI執行緒執行
onEventPostThread代表這個方法會在當前釋出事件的執行緒執行
onEventBackgroundThread事件處理是在後臺執行緒,但事件處理時間還是不應該太長,因為如果傳送事件的執行緒是後臺執行緒,會直接執行事件,
如果當前執行緒是UI執行緒,事件會被加到一個佇列中,由一個執行緒依次處理這些事件,如果某個事件處理時間太長,會阻塞後面的事件的派發或處
理。
onEventAsync每個事件會開啟一個執行緒(有執行緒池),但最好限制執行緒的數目
EventBus 3.0.0
1.匯入EventBus 3.0.0,可以使用Gradle:compile 'org.greenrobot:eventbus:3.0.0',也可以去下載jar
2.在需要接收事件的元件註冊為訂閱者(接收事件的頁面)。EventBus.getDefault().register(this);
3.自定義通知事件的類,我們慣例起名為XXXEvent
4.在訂閱者類中接收事件。
5.在需要傳送事件的地方EventBus.getDefault().post;
6.使用完成登出EventBus.getDefault.unregister(this);
EventBus 3.0.0 以後EventBus取消了約定好的方法定義,並提供了註解的方式進行監聽。
@Subscribe(threadMode = ThreadMode.MAIN)
public void getEventBus(MyEvent event){
}
threadMode就是舊版本接收資訊執行的方法。
MainThread主執行緒
BackgroundThread後臺執行緒
Async後臺執行緒
PostThread傳送執行緒(預設)
EventBus的優缺點
EventBus