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