android d-bus,android EventBus的使用
前幾天,有個朋友遇到一個面試題,問在一個 android application中,兩個activity之間如何通信。除了我們知道的broadcast、Intent、bundle以及android四大存儲類型(preference、file、數據庫和contentprovider)、繼承application類外,還有一種方法,那就是Eventbus。
當Android項目越來越龐大的時候,應用的各個部件之間的通信變得越來越復雜,例如:當某一條件發生時,應用中有幾個部件對這個消息感興趣,那么我們通常采用的就是觀察者模式,使用觀察者模式有一個弊病就是部件之間的耦合度太高,在這里我將會詳細介紹Android中的解耦組建EventBus的使用。
EventBus主要特點:(來自網絡)
1)事件訂閱函數不是基于注解(Annotation)的,而是基于命名約定的,在Android 4.0之前的版本中,注解解析起來比較慢 , 事件響應函數默認以“onEvent”開始,可以在EventBus中修改這個值,但是不推薦這么干。
2)事件響應有更多的線程選擇
EventBus可以向不同的線程中發布事件,在ThreadMode 枚舉中定義了4個線程,只需要在事件響應函數名稱“onEvent”后面添加對應的線程類型名稱,則還事件響應函數就會在對應的線程中執行,比如事件函數“onEventAsync”就會在另外一個異步線程中執行,ThreadMode定義的4個線程類型如下:
PostThread:事件響應函數和事件發布在同一線程中執行。這個是默認值,這樣可以避免線程切換。
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);
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的android d-bus,android EventBus的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android10位置信息,Androi
- 下一篇: html自动执行的事件,js自执行事件