EventBus出自greenrobot,是為android端優化的publish/subscribe的事件總線,可以簡化應用程序內組件之間、組件與後臺線程之間的通信;同時代碼也更簡潔。eg:可用來在Fragment和Activity之間通信,網絡請求後通信等
EventBus 3.0版本最突出的特性是引入了註解,可通過註解指定事件響應函數,該函數的ThreadMode等。
基本使用方法:
1、在工程的build.gradle文件中加入編譯依賴
compile 'org.greenrobot:eventbus:3.0.0'
2、自定義事件
public static class MessageEvent { /* Additional fields if needed */ }
3、添加訂閱事件響應函數
不同於2.4版本,事件響應函數不必再以onEvent開頭,而是以@Subscribe註解來標識。
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};
4、添加訂閱者 register/unregister
安卓中Activity、Fragment通常根據生命週期函數來註冊
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
5、發佈事件
EventBus.getDefault().post(new MessageEvent());
高級編程技巧
1、可通過註解指定事件響應函數的優先級
類似有序廣播的優先級,優先級高的事件響應函數優先獲得事件
@Subscribe(threadMode = ThreadMode.MAIN,priority = 100) //在ui線程執行 優先級100
public void onDataSynEvent(DataSynEvent event) {
Log.e(TAG, "event---->" + event.getCount());
}
2、高優先級的事件響應函數中,可終止事件的傳遞
注意,只能在Posting thread運行的事件響應函數可以調用該方法
EventBus.getDefault().cancelEventDelivery(event) ;
3、代碼混淆的設置
保證Subscriber方法不被移除
-keepattributes *Annotation*
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
}
4、Sticky事件
類似廣播中的sticky廣播,其訂閱/解除訂閱和普通事件一樣,但是處理訂閱函數有所不同,需要註解中添加sticky = true
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true) //在ui線程執行
public void onDataSynEvent(DataSynEvent event) {
Log.e(TAG, "event---->" + event.getCount());
}
發送sticky事件
EventBus.getDefault().postSticky(new DataSynEvent());
對於sticky廣播我們都比較清楚屬於常駐廣播,對於EventBus sticky事件也類似,我們如果不再需要該sticky事件我們可以移除
EventBus.getDefault().removeStickyEvent(new DataSynEvent());
或者調用移除所有sticky事件
EventBus.getDefault().removeAllStickyEvents();
閱讀更多 每日思一思 的文章