EventBus的ThreadMode使用以及分析(二)
簡介
回顧上篇文章 ofollow,noindex"> EventBus認識(一) 中我們談到EventBus的特性、以及EventBus在專案是如何使用的,接下來我通過上篇的例子進行深入的瞭解EventBus的ThreadMode使用以及分析。
EventBus可以處理執行緒:事件可以釋出在與釋出執行緒不同的執行緒中。一個常見的用例是處理UI更改。在Android中,UI更改必須在UI(主)執行緒中完成。另一方面,網路或任何耗時的任務不得在主執行緒上執行。EventBus幫助您處理這些任務並與UI執行緒同步(無需深入研究執行緒轉換,使用AsyncTask等)。
在EventBus中,您可以使用四個ThreadModes中的一個來定義將呼叫事件處理方法的執行緒。

EventBus-Android的釋出 - 訂閱
ThreadMode分類
ThreadMode.POSTING
訂閱者將在釋出事件的同一執行緒中呼叫。這是預設值。事件傳遞是同步完成的,一旦釋出完成,所有訂閱者都將被呼叫。此 ThreadMode
意味著開銷最小,因為它完全避免了執行緒切換。因此,這是已知完成的簡單任務的推薦模式,是一個非常短的時間而不需要主執行緒。使用此模式的事件處理程式應該快速返回以避免阻止釋出執行緒,這可能是主執行緒。
//在同一個執行緒中呼叫(預設) // ThreadMode在這裡是可選的 @Subscribe(threadMode = ThreadMode.POSTING) public void onMessageEvent(MessageEvent event) { textView.setText(event.message); }
ThreadMode.MAIN
訂閱者將在Android的主執行緒(有時稱為UI執行緒)中呼叫。如果釋出執行緒是主執行緒,則將直接呼叫事件處理程式方法(與ThreadMode.POSTING所描述的同步)。使用此模式的事件處理程式必須快速返回以避免阻塞主執行緒。
@Subscribe(threadMode = ThreadMode.MAIN) public void onMessageEvent(MessageEvent event) { Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show(); textView.setText(event.message); }
ThreadMode.MAIN_ORDERED
訂閱者將在Android的主執行緒中呼叫。該事件總是排隊等待以後交付給訂閱者,因此對post的呼叫將立即返回。這為事件處理提供了更嚴格且更一致的順序(因此名稱為 MAIN_ORDERED
)。例如,如果您在具有MAIN執行緒模式的事件處理程式中釋出另一個事件,則第二個事件處理程式將在第一個事件處理程式之前完成(因為它是同步呼叫的 - 將其與方法呼叫進行比較)。使用 MAIN_ORDERED
,第一個事件處理程式將完成,然後第二個事件處理程式將在稍後的時間點呼叫(一旦主執行緒具有容量),使用此模式的事件處理程式必須快速返回以避免阻塞主執行緒。
//在Android UI主執行緒中呼叫 @Subscribe(threadMode = ThreadMode.MAIN_ORDERED) public void onMessageEvent(MessageEvent event) { Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show(); textView.setText(event.message); }
ThreadMode.BACKGROUND
訂閱者將在後臺執行緒中呼叫。如果釋出執行緒不是主執行緒,則將在釋出執行緒中直接呼叫事件處理程式方法。如果釋出執行緒是主執行緒,則 EventBus
使用單個後臺執行緒,該執行緒將按順序傳遞其所有事件。使用此模式的事件處理程式應嘗試快速返回以避免阻塞後臺執行緒。
//在後臺執行緒中呼叫 @Subscribe(threadMode = ThreadMode.BACKGROUND) public void onMessage(MessageEvent event){ saveToDisk(event.message); }
ThreadMode.ASYNC
事件處理程式方法在單獨的執行緒中呼叫。這始終獨立於釋出執行緒和主執行緒。釋出事件永遠不會等待使用此模式的事件處理程式方法。如果事件處理程式的執行可能需要一些時間,例如用於網路訪問,則應使用此模式。避免同時觸發大量長時間執行的非同步處理程式方法來限制併發執行緒數。 EventBus
使用執行緒池從已完成的非同步事件處理程式通知中有效地重用執行緒。
//在一個單執行緒中呼叫 @Subscribe(threadMode = ThreadMode.ASYNC) public void onMessage(MessageEvent event){ backend.send(event.message); }
下載
總結
我們根據EventBus中的不同 ThreadMode
的方式來進行對我們專案的使用,在什麼情況中使用哪種執行緒將是我們所需要考慮的。
根據Android 中的執行緒不同,來使用不同的EventBus的不同執行緒。