1. EventBus 是干嘛的
EventBus是一款针对Android优化的发布/订阅事件总线。简化了应用程序内各组件间、组件与后台线程间的通信。优点是开销小,代码更优雅,以及将发送者和接收者解耦。如果Activity和Activity进行交互还好说,如果Fragment和Fragment进行交互着实令人头疼,如果用广播来处理,稍显麻烦并且效率也不高,传递的数据是实体类需要序列化,那么成本会有点高。EventBus就是解决上述麻烦的好帮手。
2. EventBus 的三要素
- Event:事件,可以使任意类型的对象。
- Subscriber:事件订阅者,接收消息并进行相应处理,必须有共有的事件处理函数。
- Publisher:事件发布者,可在任意线程发布事件,自动调用对应事件类型的处理函数。
3. EventBus 用起来很方便
3.1 添加依赖
compile 'org.greenrobot:eventbus:3.1.1' //当天版本
3.2 创建Event对象(一个普通的类,没什么说的)
public class EventDemo {
private String data;
public EventDemo(String data) {
this.data = data;
}
public String getData() {
return data;
}
}
3.3 Subscriber 处理Event
3.3.1 注册EventBus
EventBus.getDefault().register(this);
3.3.2 写Event处理函数(函数名自定义)
处理函数有几点注意:
- 必须是 public
- 必须添加注解 @Subscribe(threadMode = ThreadMode.MAIN, sticky = false)
- threadMode:线程模式,共4种,下文会提
- sticky:粘性事件,下文会提
4种线程模式:
- POSTING:Event处理函数在发布Event的线程中执行。(ANR)
- MAIN:Event处理函数在UI线程中执行。(ANR)
- BACKGROUND:如果发布Event的线程是UI线程,Event处理函数就新建子线程中执行;如果发布Event的线程是子线程,那么就在当前子线程执行。(不允许修改UI)
- ASYNC:新建子线程执行Event处理函数。(不允许修改UI)
Event处理函数例子:
@Subscribe(threadMode = ThreadMode.MAIN, sticky = false)
public void dealEvent(EventDemo eventDemo) {
//具体操作
}
注意:EventBus是根据Event处理函数的参数来区分消息的。
3.3.3 别忘了注销EventBus
EventBus.getDefault().unregister(this);
3.4 Publisher 发送Event
EventBus.getDefault().post(new EventDemo("我是发送过来的数据"));
4. 关于粘性事件
黏性事件,就是在发送事件之后再订阅该事件也能收到该事件,跟黏性广播类似。
- Event处理函数的标签中声明接收粘性事件 sticky = true
- 发送Event时调用
EventBus.getDefault().postSticky(new EventDemo("我是粘性数据"));