EventBus 筆記

分發線程(Thread Mode)

原文鏈接

EventBus可以幫你處理線程:事件可以在不同於發佈線程的線程中發佈。一個常見的用例是更新UI。在Android中,UI更新必須在UI(main)線程中完成。另一方面,網絡或任何耗時的任務都不能在主線程上運行。EventBus幫助您處理這些任務並與UI線程同步(無需深入研究線程轉換、使用AsyncTask等)。
在EventBus中,可以使用五個線程模式之一來處理接收事件。

ThreadMode: POSTING

默認模式,訂閱者將在同一線程中調用該事件。事件傳遞是同步完成的,一旦發佈完成,所有訂閱者都將被調用。
優點:最小的開銷,避免線程切換。簡單任務,推薦使用這種模式,不需要是主線程
注意事項:處理程序應快速返回,以避免阻塞線程

// Called in the same thread (default)
// ThreadMode is optional here
@Subscribe(threadMode = ThreadMode.POSTING)
public void onMessage(MessageEvent event) {
    log(event.message);
}

ThreadMode: MAIN

訂閱者將在Android的UI線程中調用。如果發佈線程是主線程,則將直接調用事件處理方法
注意事項:處理程序應快速返回,以避免阻塞UI線程

// Called in Android UI's main thread
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(MessageEvent event) {
    textField.setText(event.message);
}

ThreadMode: MAIN_ORDERED

訂閱者將在Android的UI線程中被調用。該事件總是排隊等待傳遞給訂閱者,因此對POST的調用後立即返回。這給事件處理提供了更嚴格和更一致的順序。例如,如果在MAIN線程模式中發佈另一個事件,則第二個事件處理程序將在第一個事件處理程序之前完成。使用MAIN_ORDERED線程模式,第一個事件處理程序結束,然後第二個事件處理程序將在稍後的時間點被調用(只要主線程有容量)。

// Called in Android UI's main thread
@Subscribe(threadMode = ThreadMode.MAIN_ORDERED)
public void onMessage(MessageEvent event) {
    textField.setText(event.message);
}

ThreadMode: BACKGROUND

訂閱者將在後臺線程中被調用。如果發佈線程不是UI線程,則將在POST線程中直接調用事件處理方法。如果發佈線程是主線程,EventBus使用一個將會依次傳遞所有事件的單個後臺線程。
注意事項:處理程序應儘量快速返回,以避免阻塞後臺線程。

// Called in the background thread
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onMessage(MessageEvent event){
    saveToDisk(event.message);
}

ThreadMode: ASYNC

事件處理方法在單獨的線程中被調用。這始終與發佈線程和主線程無關。發佈事件永遠不會等待事件處理方法。
使用場景:事件處理可能需要一些時間,例如用於網絡訪問。
EventBus使用線程池來有效地重用線程。避免同時觸發大量長時間運行的異步處理方法,限制併發線程的數量。

// Called in a separate thread
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onMessage(MessageEvent event){
    backend.send(event.message);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章