EventBus是在Android中使用到的发布-订阅事件总线框架,基于观察者模式,将事件的发送者和接收者解耦,简化了组件之间的通信。
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);
}
发送事件
EventBus.getDefault().post(eventModel);
处理事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void XXX(EventModel eventModel) {
......
}
粘性事件处理
在事件发送之后再订阅该事件也能收到该事件
粘性事件场景举例:如需要从A页面传递一序列化对象Obj经过B(创建)页面到达C(创建)页面,通常使用intent方式可能会产生令人头痛的样板代码,而使用postSticky进行粘性事件发送,可有效缓解这一问题
发送粘性事件
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){
......
}
优先级
priority来表示优先级,数值越大,优先级越高。在同一传递线程(ThreadMode)中,较高优先级的订户将在优先级较低的其他订户之前接收事件。默认优先级为0
*注:优先级不会影响具有不同ThreadModes的订阅者的传递顺序!
@Subscribe(priority = 1);
public void XXX(EventModel eventModel) {
//do something
}
取消事件传递
同一线程下事件的优先级越高接收的数据最快,所以当优先级不想分发事件给低级别的事件时,可以使用cancelEventDelivery方法,入参是订阅的实体参数
@Subscribe(priority = 1000,threadMode = ThreadMode.POSTING)
public void onEvent(EventModel eventModel){
// 取消事件传递
// 只有在threadMode = ThreadMode.POSTING情况下,低级别的事件无法接收到信息
EventBus.getDefault().cancelEventDelivery(eventModel) ;
}
混淆规则
-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);
}
网友评论