介绍
1、EventBus是Android下高效的发布/订阅事件总线机制。作用是可以代替传统的Intent,Handler,Broadcast或接口函数在Fragment,Activity,Service,线程之间传递数据,执行方法。特点是代码简洁,是一种发布订阅设计模式(Publish/Subsribe),或称作观察者设计模式。
2、EventBus 3.0 最新的特性就是加入了注解,通过注解的方式 告知订阅函数运行在哪个线程中。
EventBus源码地址:https://github.com/greenrobot/EventBus
具体使用
1、Gradle中添加引用
compile 'org.greenrobot:eventbus:3.0.0'
2、定义一个事件类
public class DataEvent {
private String msg;
public DataEvent(String msg) {
super();
this.msg = msg;
}
public String getMsg() {
return msg;
}
}
3、事件订阅和取消
添加订阅:
EventBus.getDefault().register(this);//订阅
取消订阅:
EventBus.getDefault().unregister(this);//解除订阅
在具体代码中应用:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
4、发布者发布事件:
EventBus.getDefault().post(new DataEvent("我来发布消息"));
5、订阅事件处理:
@Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行
public void onDataEvent(DataEvent event) {
Log.d("接收者", "event----" + event.getMsg());
}
ThreadMode总共四个:MAIN UI主线程;BACKGROUND 后台线程;POSTING 和发布者处在同一个线程;ASYNC 异步线程。
其他:
1、订阅事件的优先级:
//事件的优先级类似广播的优先级,优先级越高优先获得消息
@Subscribe(threadMode = ThreadMode.MAIN,priority = 100) //在ui线程执行 优先级100
public void onDataSynEvent(DataSynEvent event) {
}
2、终止事件往下传递:
//发送有序广播可以终止广播的继续往下传递,EventBus也实现了此功能
EventBus.getDefault().cancelEventDelivery(event) ;//优先级高的订阅者可以终止事件往下传递
3、混淆处理
-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);
}