1. 程式人生 > >EventBus3.0使用總結(二)EventBus的執行緒模式

EventBus3.0使用總結(二)EventBus的執行緒模式

在通過指定執行緒模式宣告訂閱方法的時候使用的是ThreadMode.MAIN執行緒模式。

@Subscribe(threadMode = ThreadMode.MAIN) 

EventBus有4種執行緒模式:

  1. ThreadMode: POSTING
  2. ThreadMode: MAIN
  3. ThreadMode: BACKGROUND
  4. 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);
}

以上程式碼模擬場景:

  1. 點選按鈕傳送一個MessageEvent
  2. BACKGROUND執行緒模式下的訂閱者監聽MessageEvent,接收到MessageEvent後改變資料,然後傳送一個BackgroundEvent事件
  3. MAIN執行緒模式下的訂閱者監聽BackgroundEvent,然後更新UI。

ThreadMode: ASYNC

該模式的訂閱事件是在獨立的執行緒中執行,既不在釋出事件的執行緒中,也不在主執行緒中。
EventBus有專門的執行緒池對子執行緒進行管理,但仍然要避免同一時間開啟太多的ASYNC模式執行緒。

ASYNC模式方便用來進行網路載入。

到此,EventBus的執行緒模式都介紹完了,本質區別是EventBus的訂閱事件如何Delivery(消費)。

歡迎大家留言討論!