前言
EventBus是一个基于发布/订阅的事件总线(数据通信框架),它简化了组件之间、线程之间的数据通信操作,并且耦合度低、开销小。
3.0版本后,使用注解来声明订阅者函数及其相关属性,使得操作流程更加便捷,还提供index帮助提升其性能。
(如果你不喜欢用EventBus,而想用RxJava自己封装一个RxBus来实现通信,
可以参考http://www.jianshu.com/p/3a3462535b4d)
介绍
下面从 配置、基本使用、粘性事件、使用index优化、简单封装、混淆 这几个部分来介绍EventBus。
1. 配置
在Module下的build.gradle中添加
//EventBus
compile 'org.greenrobot:eventbus:3.0.0'
annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.0.1'//用于eventbus开启Index加速
2. 基本使用
使用步骤分为定义事件、订阅事件、发送事件、处理事件、取消订阅五步
2.1 定义事件
先定义一个你打算发送的事件类,里面添加你要发送的数据变量。
变量的类型除了基本数据类型,也可以是自定义的实体类。
public class MovieEvent {
private int count;
public MovieEvent(int count) {
this.count = count;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
2.2 订阅事件
在你要接收事件的地方订阅事件:
public class MovieActivity{
....
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//确保之前未订阅过,再调用订阅语句,以免报错
if(!EventBus.getDefault().isRegistered(subscriber)){
EventBus.getDefault().register(subscriber);
}
}
....
}
2.3 发送事件
在你要发送事件的地方,调用
EventBus.getDefault().post(new MovieEvent(1));
这里需要注意,发送的事件是属于引用传递,也就是说,发送事件后,你在事件处理函数中对接收到的事件进行了修改,那么发送源头的事件也会跟着改变。所以如果不想影响到发送源头的数据,建议new对象后再发送。
另外,EventBus提供了一个方法用于发送粘性事件,粘性事件相关内容会在下面另外介绍。
EventBus.getDefault().postSticky(new MovieEvent(1));
2.4 处理事件
在接收事件的地方添加处理事件的方法,请与订阅事件方法处于同一个类下,以保证能成功订阅事件
<