本篇是基于 http://www.lxweimin.com/p/acfe78296bb5 這篇文章。簡單的總結下,加深記憶。(其實就是copy)
前言
EventBus是greenrobot在Android平臺發布的一款以訂閱——發布模式為核心的開源庫。EventBus翻譯過來是事件總線的意思,可以這樣理解:一個個事件(event)發送到總線上,然后EventBus根據已注冊的訂閱者(subscribers)來匹配相應的事件,進而把事件傳遞給訂閱者,這也是觀察者模式的一個最佳實踐。
那么EventBus可以用到什么地方呢?我們平時開發的時候,當遇到Activity與Activity、Activity與Fragment之間的通信,往往采用Intent,又或者線程之間使用Handler進行通信,這樣代碼難免會復雜許多,而使用EventBus能極大簡化兩個組件之間的通信問題,而且效率極高,而EventBus升級到3.0版本后,開發者能夠自定義訂閱方法的名字,而沒必要規定以“onEventXX”開頭的方法了,這樣也自由化了很多,而且支持了粘性事件的分發等,因此學會使用EventBus3.0對我們的開發有極大的好處。
相比于EventBus 之前的版本。
- 訂閱者的訂閱方法的名字可以隨意,不用必須寫OnEvent(...);
- 必須要在訂閱者的訂閱方法上添加 @Subscribe(里面的內容后面有)次注解
- 新的版本添加粘性事件的分發、訂閱者的線程工作、優先級的問題。使用更給力
和之前一樣 注冊和銷毀 沒變
//注冊成為訂閱者
EventBus.getDefault().register(this);
@Override
protected void onDestroy() {
super.onDestroy();
//解除注冊
EventBus.getDefault().unregister(this);
}
//訂閱方法,當接收到事件的時候,會調用該方法
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(MessageEvent messageEvent){
//這個OnEvent(...); 名字可以變化。但是必須加注解
}
下面聊一下@Subscribe
里面有三個注解可以使用分別為:
-
ThreadMode 代表訂閱方法所運行的線程
- POSTING:表示訂閱方法運行在發送事件的線程**(默認)
** - MAIN:表示訂閱方法運行在UI線程,由于UI線程不能阻塞,因此當使用MAIN的時候,訂閱方法不應該耗時過長。
- BACKGROUND:表示訂閱方法運行在后臺線程,如果發送的事件線程不是UI線程,那么就使用該線程;如果發送事件的線程是UI線程,那么新建一個后臺線程來調用訂閱方法。
- ASYNC:訂閱方法與發送事件始終不在同一個線程,即訂閱方法始終會使用新的線程來運行。
- POSTING:表示訂閱方法運行在發送事件的線程**(默認)
-
sticky 代表是否是粘性事件
設置該優先級的目的是,當一個事件有多個訂閱者的時候,優先級高的會優先接收到事件。 -
priority 代表優先級
關于粘性事件,可以參考Android的廣播機制,其中有一個粘性廣播,粘性廣播的意思是:該廣播發送后,會保存在內存中,如果后來有注冊的Receiver與之匹配,那么該Receiver便會接收到該廣播。那么粘性事件同理,在注冊之前便把事件發生出去,等到注冊之后便會收到最近發送的粘性事件(必須匹配)。注意:只會接收到最近發送的一次粘性事件,之前的會接受不到。(在注冊后可以馬上接受到離自己最近的一次事件)