參考:
- Android 框架煉成 教你如何寫組件間通信框架EventBus
- Android EventBus源碼解析 帶你深入理解EventBus
- Android EventBus實戰 沒聽過你就out了
- 快速Android開發系列通信篇之EventBus
EventBus是一個publish/subscribe (發布 / 訂閱) 消息的總線,簡化了應用程序內各組件間、組件與后臺線程間的通信。比如請求網絡,等網絡返回時通過Handler或Broadcast通知UI,兩個Fragment之間需要通過Listener通信,這些需求都可以通過EventBus實現。
GitHub地址:https://github.com/greenrobot/EventBus
作為一個消息總線,有三個主要的元素:
- Event:事件
- Subscriber:事件訂閱者,接收特定的事件
- Publisher:事件發布者,用于通知Subscriber有事件發生
e.g. 使用方式:
1. ?在訂閱事件的activity中創建 onEvent方法。
2. ?EventBus.getDefault().register(this);//訂閱事件。
register會把當前類中匹配的方法(是否以onEvent開頭,是否是public且非static和abstract方法,是否是一個參數),存入一個map(EventBus存儲方法的地方)。
3. ?EventBus.getDefault().post(object);//在任何業務邏輯處理中發布事件。
根據實參去map查找進行反射調用。
4. ?EventBus.getDefault().unregister(this);//在activity ondestroy中取消訂閱。
其中?onEvent方法 對應 post那邊的?ThreadMode:
- PostThread:(對應onEvent)事件的處理在和事件的發送在相同的進程,所以事件處理時間不應太長,不然影響事件的發送線程,而這個線程可能是UI線程。
- MainThread: (對應onEventMainThread)事件的處理會在UI線程中執行。事件處理時間不能太長,這個不用說的,長了會ANR的。
- BackgroundThread:(對應onEventBackgroundThread)事件的處理會在一個后臺線程中執行,雖然名字是BackgroundThread,事件處理是在后臺線程,但事件處理時間還是不應該太長,因為如果發送事件的線程是后臺線程,會直接執行事件,如果當前線程是UI線程,事件會被加到一個隊列中,由一個線程依次處理這些事件,如果某個事件處理時間太長,會阻塞后面的事件的派發或處理。
- Async(對應onEventBackgroundThread)事件處理會在單獨的線程中執行,主要用于在后臺線程中執行耗時操作,將任務加入到后臺的一個隊列,最終由Eventbus中的一個線程池去調用;線程池與BackgroundThread用的是同一個。
其中BackgroundThread和Async的區別是:
BackgroundThread中的任務,一個接著一個去調用,中間使用了一個布爾型變量handlerActive進行的控制。
Async則會動態控制并發。
?