EventBus初步使用
1、认识EventBus
最早使用EventBus是在19年底,一位同学为了解耦代码引入的。深入学习一个开源库之前,得先了解它是干什么的,怎么用,现在记录一下。
GitHub:greenrobot/EventBus
官网:greenrobot.org/eventbus

1.1、介绍
在使用EventBus之前,为了解耦各个组件之间的通信,常见的一种方法是使用广播,更高效一点就用本地广播。EventBus的出现极大的简化了应用各组件之间的通信。主要优点官方都总结了:
- 简化组件之间的通信
- 分离事件发送者和接收者
- 避免复杂且容易出错的依赖关系和生命周期问题
- 非常快
- 非常小(不到60kb),源代码1800余行
1.2、事件、订阅者、发布者
EventBus作为事件发布总线,实现少不了观察者模式,有三个伙伴:
①事件:任意类型。发布者根据该事件类型,通知订阅该事件类型的订阅者。
②订阅者:订阅上面的事件,必须定义用@Subscribe注释的订阅方法。
③发布者:这里即EventBus实例本身,用EventBus.getDefault()获取默认发布者即可。
1.3、引入EventBus
项目中引入EventBus,在build.gradle中添加如下依赖。依赖下载慢可以参考依赖库下载慢的解决办法。
implementation 'org.greenrobot:eventbus:3.2.0'
2、EventBus快速上手
优秀的开源库,往往只需要最简单的操作。正如EventBus官方文档所描述,EventBus 使用起来就像 1-2-3 一样简单。
2.1、定义事件
EventBus对事件类型没有任何特定要求,定义一个简单的POJO(Plain Old Java Object)即可。这里以一个简单的消息事件为例:
public class MessageEvent {
public final String message;
public MessageEvent(String message) {
this.message = message;
}
}
根据实际业务,定义更复杂的事件类。
2.2、订阅事件
①定义订阅者方法处理事件(对于 EventBus 3,可以自由选择方法名称。没有像 EventBus 2 那样有命名约定)。
public void onEvent(MessageEvent messageEvent) {
textView.setText(messageEvent.message);
}
并用@Subscribe 注释定义订阅者方法,Subscribe 注解有三个参数:线程模式、是否粘性事件、事件优先级。这里先不深究该注解的原理,关于Subscribe 注解详见EventBus源码分析(三):Subscribe注解详解一文。
@Subscribe(threadMode = ThreadMode.BACKGROUND, sticky = true, priority = 100)
public void onEvent(MessageEvent messageEvent) {
textView.setText(messageEvent.message);
}
②注册订阅者。通过EventBus的getDefault()方法获取默认实现单例,注册定义订阅方法的订阅者。
@Override
protected void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
注册过的对象一定要执行反注册。在Android开发中onStart()和onStop()是一对不错的注册和反注册搭档。
@Override
protected void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
2.3、发送事件
订阅者已经订阅了事件,就等接收事件。接下来就该发送事件给订阅者,非常的简洁,就一行代码发送事件:
EventBus.getDefault().post(new MessageEvent("Hello EventBus"));
//或者发送粘性事件
EventBus.getDefault().postSticky(new MessageEvent("Hello EventBus"));
可以从代码的任何地方发布事件,所有当前注册的与事件类型匹配的订阅者都会收到事件通知。极大的解耦了组件代码,不再需要用各种事件回调。
到这里EventBus算是已经 "了解" 了。会不会有一些疑问:事件发布后所有的订阅者都能收到吗?如何向特定的订阅者发布事件?
参考资料:
EventBus Documentation
How to get started with EventBus in 3 steps
“本地广播”LocalBroadcastManager源码解析
BroadcastReceiver:广播的使用