EventBus3.0使用總結(二)EventBus的執行緒模式
阿新 • • 發佈:2019-02-05
在通過指定執行緒模式宣告訂閱方法的時候使用的是ThreadMode.MAIN執行緒模式。
@Subscribe(threadMode = ThreadMode.MAIN)
EventBus有4種執行緒模式:
- ThreadMode: POSTING
- ThreadMode: MAIN
- ThreadMode: BACKGROUND
- ThreadMode: ASYNC
可以在同一個執行緒中進行事件的繫結和釋出,也可以在不同執行緒中進行事件的繫結和釋出;EventBus對執行緒進行了安全管理。
ThreadMode: POSTING
POSTING模式是EventBus預設的執行緒模式,要求傳送和訂閱Event的操作在同一執行緒中進行。因為避免了執行緒切換操作,所以該模式執行效率最快。當然這種模式的執行緒通常都代表Android的主執行緒,因此儘量避免在該訂閱事件中進行耗時操作。
上一篇文章簡單例項中的訂閱事件就可以改為:
@Subscribe(threadMode = ThreadMode.POSTING)
public void onMessageEvent(MessageEvent event){
String msgInfo = event.getMsg();
infoTV.setText(msgInfo);
}
ThreadMode: MAIN
該執行緒模式下的訂閱者需要執行在Android的主執行緒中。如果在該模式下發送事件的操作在主執行緒中,其效果跟POSTING模式一樣。但是通常該模式的釋出事件都是在子執行緒中執行,然後主執行緒中訂閱事件去響應UI。
簡單例項:
/**
* 點選事件
* @param view
*/
public void post(View view){
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3*1000);
EventBus.getDefault().post(new MessageEvent("收到更新資料"));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
@Subscribe (threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event){
String msgInfo = event.getMsg();
infoTV.setText(msgInfo);
}
ThreadMode: BACKGROUND
訂閱事件在子執行緒執行,兩種情況:
- 如果在子執行緒中Post(傳送)Event事件,那麼該模式的訂閱事件也在當前子執行緒執行;
- 如果在主執行緒中Post(傳送)Event事件,那麼EventBus會給該模式的訂閱事件建立一個獨立的子執行緒來執行訂閱方法。
/**
* 點選事件
* @param view
*/
public void post(View view){
EventBus.getDefault().post(new MessageEvent("收到更新資料"));
}
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onMessageEvent(MessageEvent event){
String msgInfo = event.getMsg();
msgInfo = Thread.currentThread().getName() + "子執行緒中修改了引數";
EventBus.getDefault().post(new BackgroundEvent(msgInfo));
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMainMessageEvent(BackgroundEvent event){
String info = event.getMsg();
infoTV.setText(info);
}
以上程式碼模擬場景:
- 點選按鈕傳送一個MessageEvent
- BACKGROUND執行緒模式下的訂閱者監聽MessageEvent,接收到MessageEvent後改變資料,然後傳送一個BackgroundEvent事件
- MAIN執行緒模式下的訂閱者監聽BackgroundEvent,然後更新UI。
ThreadMode: ASYNC
該模式的訂閱事件是在獨立的執行緒中執行,既不在釋出事件的執行緒中,也不在主執行緒中。
EventBus有專門的執行緒池對子執行緒進行管理,但仍然要避免同一時間開啟太多的ASYNC模式執行緒。
ASYNC模式方便用來進行網路載入。
到此,EventBus的執行緒模式都介紹完了,本質區別是EventBus的訂閱事件如何Delivery(消費)。
歡迎大家留言討論!