github地址:https://github.com/greenrobot/EventBus
EventBus3.x的使用方法基本与EventBus2.x的相同,但是3.x可以使用注解处理器,由于2.x使用的是运行时注解,很大基础上依赖Java的反射机制,效率不高。
反射机制对整个注册的类的所有方法进行扫描,所以消耗性能,而开启系统索引的3.x效率比2.x快很多
EventBus注解处理器文档:https://greenrobot.org/eventbus/documentation/subscriber-index/
EventBus相信大家已经非常熟悉,但是官方介绍还是有不正确的地方,我们看一下github上的介绍级使用
首先引入依赖
implementation 'org.greenrobot:eventbus:3.2.0'
step 1 创建一个事件
public static class MessageEvent { /* Additional fields if needed */ }
step 2 注册、反注册、订阅
// 注册
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
// 反注册
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
// 订阅事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};
step 3 发送事件
EventBus.getDefault().post(new MessageEvent());
以上是作者介绍的使用方法,这里有两个问题
- 1.在 onStop()中反注册会导致无法接收到新页面或着其他页面发送的事件
- 2.从EventBus源码中我们知道它的原理使用的是反射,性能较低
下面我们来解决上面提到的两个问题,看一下正确的使用方法
1.首先引入依赖
注意:增加了一个注解处理器的引用,注解处理器的版本跟随eventbus的版本
implementation 'org.greenrobot:eventbus:3.2.0'
annotationProcessor "org.greenrobot:eventbus-annotation-processor:3.2.0"
2.在build.gradle添加索引
添加eventbus的注释处理器 使用的依赖annotationProcessor 配置。通过添加eventBusIndex处理器选项生成的索引类的包和名称。
com.example.myapp
替换为自己的包名
MyEventBusIndex
可自定义其他名称,不同Module注册不同名称的索引
android {
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [ eventBusIndex : 'com.example.myapp.MyEventBusIndex' ]
}
}
}
}
3.在Application中初始化
// 添加注解参数
EventBus.builder().addIndex(new MyEventBusIndex()).build();
或
// 添加注解参数
EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();
在Application中添加以上代码会发现new MyEventBusIndex()
报红,此时build一下项目即可,
如果依然报红,则需要有Activity、Fragment等订阅事件之后才会在编译后自动生成,订阅事件之后,build项目
如果其他组件或者模块也需要使用注解处理器,则
EventBus eventBus = EventBus.builder()
.addIndex(new MyEventBusAppIndex())
.addIndex(new MyEventBusLibIndex()).build();
MyEventBusAppIndex ()
MyEventBusLibIndex ()
为第二步中定义的不同模块的索引
4.注册与反注册
// onCreate中注册
@Override
protected void onCreate(Bundle savedInstanceState) {
EventBus.getDefault().register(this);
}
// onDestroy中反注册,建议先判断注册状态
@Override
protected void onDestroy() {
if (EventBus.getDefault().isRegistered(this)) {
EventBus.getDefault().unregister(this);
}
}
5.发送事件及订阅事件
// 自定义事件
public static class MessageEvent { /* Additional fields if needed */ }
// 发送事件
EventBus.getDefault().post(new MessageEvent());
// 订阅事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};
EventBus3.x的正确使用到此就结束了
网友评论