EventBus

EventBus 是Android上的以發佈\訂閱事件爲核心的庫。
事件 ( event ) 經過 post() 發送到總線,而後再分發到匹配事件類型的訂閱者 ( subscribers ) 。
訂閱者只有在總線中註冊 ( register ) 了才能收到事件,註銷 ( unrigister ) 以後就收不到任何事件了。
事件方法必須帶有 Subscribe 的註解,必須是 public ,沒有返回類型 void 而且只能有一個參數。java

EventBus.getDefault()全部事件註冊,分發到同一條總線。git

訂閱者能夠註冊到不一樣的線上的 EventBus ,經過不一樣的 EventBus 實例來發送數據,不一樣的 EventBus 是相互隔離開的,訂閱者都只會收到註冊到該線上事件。
EventBus bus = new EventBus();github


1.訂閱:
1.1 訂閱者優先級(Subscriber Priorities),能夠經過提高優先級來修改事件傳遞的順序。EventBus默認的優先級是0。
@Subscribe(priority = 1);
public void onEvent(MessageEvent event) {

}
在相同的線程模式下,高優先級的訂閱者將會比低優先級的訂閱者更早接收到事件。 
注意:優先級不會影響不一樣線程模式下的訂閱者接收事件的順序。app

1.2 父類中定義的訂閱方法不能被子類重寫。
調用EventBus.getDefault().regist(this)後,EventBus就會查詢當前類及其父類中的訂閱方法,若是發現父類中也訂閱了相同的訂閱方法(被子類override了),則會拋出異常ide

1.3 EventBus對繼承的父類也會進行查找註冊函數,即子類註冊一次便可,父類直接使用 @Subscribe來產生訂閱函數。函數

2.  取消事件(Cancelling event delivery)
你能夠在訂閱者的事件處理方法中經過調用cancelEventDelivery去中斷事件傳遞的過程。任何下一步的事件都會被取消;以後的訂閱者也不會收到事件。
// Called in the same thread (default)
@Subscribe
public void onEvent(MessageEvent event){
// Process the event

EventBus.getDefault().cancelEventDelivery(event) ;
}
事件通常都是被高優先級的訂閱者取消傳遞的。事件取消僅限於默認的ThreadMode.PostThread下才可使用。
其餘類型有:@Subscrible(threadMode = ThreadMode.ASYNC) 
@Subscrible(threadMode = ThreadMode.BACKGRAND)
@Subscrible(threadMode = ThreadMode.MAIN) post

3. Sticky事件:ui

發送粘性事件
EventBus.getDefault().postSticky(new DataSynEvent());this

對於粘性廣播咱們都比較清楚屬於常駐廣播,對於EventBus粘性事件也相似,咱們若是再也不須要該粘性事件咱們能夠移除:
DataSynEvent stickyEvent = EventBus.getDefault().getStickyEvent(DataSynEvent.class);  
// Better check that an event was actually posted before  
if(stickyEvent != null) {  
    // "Consume" the sticky event  
    EventBus.getDefault().removeStickyEvent(stickyEvent);  
/    / Now do something with it  
}.net

或者調用移除全部粘性事件:
EventBus.getDefault().removeAllStickyEvents();


@Override  
public void onStart() {  
super.onStart();  
EventBus.getDefault().register(this);  

@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}

    @Subscribe(threadMode = ThreadMode.MAIN,sticky = true) 
    // 在ui線程執行Sticky事件
    // 發送事件以後再訂閱該事件也能收到Sticky事件
    public void onDataSynEvent(DataSynEvent event) {
        Log.e(TAG, "event---->" + event.getCount());
    }


目前EventBus只支持跨線程,而不支持跨進程。若是一個app的service起到了另外一個進程中,那麼註冊監聽的模塊則會收不到另外一個進程的EventBus發出的事件。

https://github.com/greenrobot/EventBus/
http://blog.csdn.net/afei__/article/details/52103746


# 混淆 EventBus
-keepattributes *Annotation*
-keepclassmembers class ** {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }

# Only required if you use AsyncExecutor -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {     <init>(java.lang.Throwable); }

相關文章
相關標籤/搜索