EventBus 簡單使用(一)
好用,但是要用好不容易!
EventBus 介紹
ofollow,noindex">官網地址:http://greenrobot.org/eventbus/
使用介紹地址:http://greenrobot.org/eventbus/documentation/
EventBus 使用場景
EventBus
是一個Android
和Java
的開源庫,使用釋出者/訂閱者
模式進行鬆散耦合。
事件釋出訂閱就像是生活中的:你訂閱了一家雜誌的書刊,每到固定的時間,雜誌社就會把書送給你。
Android
中對應的就是,我在某個頁面需要得到某個資料或者某個物件,那麼我在當前頁面先訂閱,那麼在擁有該資料或者物件的操作中傳送事件。我就能在對應的已經訂閱了該資料或者該物件的頁面得到傳送的事件。
-
替換
Handler
重新整理UI
問題 -
Activity
頁面跳轉資料傳遞 -
Fagment
頁面切換資料重新整理問題 - 資料該表通知頁面及時重新整理
- 等等...
使用
第一步:新增依賴
compile 'org.greenrobot:eventbus:3.1.1'
第二步:定義Java物件
public class MessageEvent { public final String message; public MessageEvent(String message) { this.message = message; } }
第三步:準備訂閱者
在Activity
或者Fragment
中的onResume()
和onPause()
中註冊,再定義一個方法用來接受事件。
@Override public void onResume() { super.onResume(); EventBus.getDefault().register(this); } @Override public void onPause() { super.onPause(); EventBus.getDefault().unregister(this); } /** *下面是兩種方式接收事件 *第一個是:聲明瞭在主執行緒中接收,可以進行 UI 相關的操作 *第二個是:沒有宣告在主執行緒中接收,重新整理 UI 可能會出現問題 */ // This method will be called when a MessageEvent is posted (in the UI thread for Toast) @Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(MessageEvent event) { Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show(); } // This method will be called when a SomeOtherEvent is posted @Subscribe public void handleSomethingElse(SomeOtherEvent event) { doSomethingWith(event);
第四步:傳送事件
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
以上就完成了 EventBus 的簡單使用~
上面說到了在處理事件時可以指定執行緒,它有以下四種執行緒模式:
-
ThreadMode: POSTING
訂閱者將在釋出事件的同一執行緒中呼叫。這是預設的模式,也是
EventBus
推薦使用的模式,因為它開銷最小。使用該模式應該要快速響應,避免執行緒阻塞。使用例子如下:
// Called in the same thread (default) // ThreadMode is optional here @Subscribe(threadMode = ThreadMode.POSTING) public void onMessage(MessageEvent event) { log(event.message); }
-
ThreadMode: MAIN
在
UI
執行緒中呼叫。使用該模式應該要快速響應,避免執行緒阻塞。使用例子如下:
// Called in Android UI's main thread @Subscribe(threadMode = ThreadMode.MAIN) public void onMessage(MessageEvent event) { textField.setText(event.message); }
-
ThreadMode: MAIN_ORDERED
在
UI
執行緒中呼叫,並且事件是有順序的,按順序返回。使用該模式應該要快速響應,避免執行緒阻塞。使用例子如下:
// Called in Android UI's main thread @Subscribe(threadMode = ThreadMode.MAIN_ORDERED) public void onMessage(MessageEvent event) { textField.setText(event.message); }
-
ThreadMode: BACKGROUND
訂閱者將在後臺執行緒中呼叫。如果釋出執行緒不是主執行緒,則將在釋出執行緒中直接呼叫事件處理程式方法;如果釋出執行緒是主執行緒,則EventBus使用單個後臺執行緒,該執行緒將按順序傳遞其所有事件。使用此模式的事件處理程式應快速返回以避免阻塞後臺執行緒
// Called in the background thread @Subscribe(threadMode = ThreadMode.BACKGROUND) public void onMessage(MessageEvent event){ saveToDisk(event.message); }
-
ThreadMode: ASYNC
事件處理程式方法在單獨的執行緒中呼叫,使用此模式的事件處理程式應快速返回以避免阻塞後臺執行緒。
// Called in a separate thread @Subscribe(threadMode = ThreadMode.ASYNC) public void onMessage(MessageEvent event){ backend.send(event.message); }