EventBus是在Android中使用到的發(fā)布-訂閱事件總線框架,基于觀察者模式审葬,將事件的發(fā)送者和接收者解耦,簡化了組件之間的通信。
Gradle配置
implementation 'org.greenrobot:eventbus:3.1.1'
自定義事件類
public class EventModel {
......
}
普通事件處理
在Activity和Fragment生命周期中進行注冊/注銷訂閱者
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
發(fā)送事件
EventBus.getDefault().post(eventModel);
處理事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void XXX(EventModel eventModel) {
......
}
粘性事件處理
在事件發(fā)送之后再訂閱該事件也能收到該事件
粘性事件場景舉例:如需要從A頁面?zhèn)鬟f一序列化對象Obj經(jīng)過B(創(chuàng)建)頁面到達C(創(chuàng)建)頁面寄疏,通常使用intent方式可能會產(chǎn)生令人頭痛的樣板代碼,而使用postSticky進行粘性事件發(fā)送僵井,可有效緩解這一問題
發(fā)送粘性事件
EventBus.getDefault().postSticky(new EventModel("粘性事件"));
注冊粘性事件(如在onClick中注冊)
XXX.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().register(MainActivity.this);
}
});
處理粘性事件
@Subscribe(threadMode = ThreadMode.POSTING陕截,sticky = true)
public void XXX(EventModel eventModel){
......
}
優(yōu)先級
priority來表示優(yōu)先級,數(shù)值越大批什,優(yōu)先級越高农曲。在同一傳遞線程(ThreadMode)中,較高優(yōu)先級的訂戶將在優(yōu)先級較低的其他訂戶之前接收事件驻债。默認優(yōu)先級為0
*注:優(yōu)先級不會影響具有不同ThreadModes的訂閱者的傳遞順序乳规!
@Subscribe(priority = 1);
public void XXX(EventModel eventModel) {
//do something
}
取消事件傳遞
同一線程下事件的優(yōu)先級越高接收的數(shù)據(jù)最快,所以當優(yōu)先級不想分發(fā)事件給低級別的事件時合呐,可以使用cancelEventDelivery方法暮的,入?yún)⑹怯嗛喌膶嶓w參數(shù)
@Subscribe(priority = 1000,threadMode = ThreadMode.POSTING)
public void onEvent(EventModel eventModel){
// 取消事件傳遞
// 只有在threadMode = ThreadMode.POSTING情況下,低級別的事件無法接收到信息
EventBus.getDefault().cancelEventDelivery(eventModel) ;
}
混淆規(guī)則
-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);
}