基本的:http://www.360doc.com/content/14/0821/16/19022950_403599285.shtmlhtml
詳細的:http://www.cnblogs.com/angeldevil/p/3715934.html
android
遇到一個面試題,問在一個 android application中,兩個activity之間如何通訊。除了咱們知道的broadcast、Intent、bundle以及android四大存儲類型(preference、file、數據庫和contentprovider)、繼承application類外,還有一種方法,那就是Eventbus。面試
當Android項目愈來愈龐大的時候,應用的各個部件之間的通訊變得愈來愈複雜,例如:當某一條件發生時,應用中有幾個部件對這個消息感興趣,那麼咱們一般採用的就是觀察者模式,使用觀察者模式有一個弊病就是部件之間的耦合度過高,在這裏我將會詳細介紹Android中的解耦組建EventBus的使用。數據庫
EventBus主要特色:(來自網絡)網絡
1)事件訂閱函數不是基於註解(Annotation)的,而是基於命名約定的,在Android 4.0以前的版本中,註解解析起來比較慢 , 事件響應函數默認以「onEvent」開始,能夠在EventBus中修改這個值,可是不推薦這麼幹。app
2)事件響應有更多的線程選擇異步
EventBus能夠向不一樣的線程中發佈事件,在ThreadMode 枚舉中定義了4個線程,只須要在事件響應函數名稱「onEvent」後面添加對應的線程類型名稱,則還事件響應函數就會在對應的線程中執行,好比事件函數「onEventAsync」就會在另一個異步線程中執行,ThreadMode定義的4個線程類型以下:async
PostThread:事件響應函數和事件發佈在同一線程中執行。這個是默認值,這樣能夠避免線程切換。ide
MainThread:事件響應函數會在Android應用的主線程(大部分狀況下都是UI線程)中執行。函數
BackgroundThread:事件響應函數會在一個後臺線程中執行。若是事件發佈函數不是在主線程中,則會當即在事件發佈線程中執行響應函數。若是事件發佈函數在主線程中,EventBus則會在惟一的一個後臺線程中按照順序來執行全部的後臺事件響應函數。
上面的3種事件響應函數,應該可以很快的執行完,否則的話會阻塞各自的事件發佈。
async:事件響應函數在另一個異步線程中執行。該線程和發佈線程、主線程相互獨立。若是事件響應函數須要較長的時間來執行,則應該使用該模式,例如 網絡訪問等。須要注意的是,因爲系統並行的限制,應該避免在同一時間觸發大量的異步線程。 EventBus使用一個線程池來提升線程的效率。
3)EventBus支持 Sticky Event
有時候某個事件可能會用到屢次,好比在前面介紹Event Bus模型一文的示例中,最新的位置更新信息,可能須要屢次用到,真對這種狀況,您能夠把該事件發佈爲Sticky Event,而後,當須要查詢該信息的時候,能夠經過Bus的getStickyEvent(ClasseventType) 函數來查詢最新發布的Event對象。
同一類型的事件只保存最新的Event對象。
註冊和發佈事件的函數分別爲 registerSticky(…) 和 postSticky(Object event)
在項目主頁上還有和Otto之間性能對比的表格,以及性能測試的源碼。
不論是生產者仍是訂閱者都須要向Bus註冊本身:
bus.register(this);
在每一個Activity或者Fragment的onResume和onPause函數中都須要調用bus.register(this)和bus.unregister(this)函數比較麻煩,能夠經過一個Bus包裝類來自動完成註冊的工做,而後在類中只須要繼承基類,並調用函數getScopedBus().register(…) 來註冊須要的對象便可。
EventBus四種類型的回調函數:
a、onEvent 它和ThreadModel中的PostThread對應,這個也是默認的類型,當使用這種類型時,回調函數和發起事件的函數會在同
一個線程中執行
b、onEventMainThread,當使用這種類型時,回調函數會在主線程中執行,這個在Android中很是有用,由於在Android中禁止在子線
程中修改UI
c、onEventBackgroundThread,當使用這種類型時,若是事件發起函數在主線程中執行,那麼回調函數另啓動一個子線程,若是事件
發起函數在子線程執行,那麼回調函數就在這個子線程執行。
d、onEventBusAsync,當使用這種類型時,無論事件發起函數在哪裏執行,都會另起一個線程去執行回調。
EventBus的使用方式:
1)定義一個observer,並加入@Subscribe做爲消息回調函數
2)將observer註冊到EventBus;EventBus.register(this);
3)消息投遞:eventBus.post(logTo);