EventBus 3.0使用方法

EventBus出自greenrobot,是為android端優化的publish/subscribe的事件總線,可以簡化應用程序內組件之間、組件與後臺線程之間的通信;同時代碼也更簡潔。eg:可用來在Fragment和Activity之間通信,網絡請求後通信等

EventBus 3.0使用方法

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 {

(java.lang.Throwable);

}

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();


分享到:


相關文章: