EventBus出自greenrobot,是为android端优化的publish/subscribe的事件总线,可以简化应用程序内组件之间、组件与后台线程之间的通信;同时代码也更简洁。eg:可用来在Fragment和Activity之间通信,网络请求后通信等
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 <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);
}
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();