EventBus3.0介绍与正确使用
常规的事件传递
- Intent意图,跳转+传参(局限性非常大)
- Handler,通常用来更新主线程UI 泗洪不当容易内存泄漏
- Interface接口,仅限于同一线程中数据交互
- BroadCastReceiver,有序广播+无序广播
- AIDL跨进程通信,代码阅读性不友好,维护成本偏高
- 其他方式,比如本地存储。。。
什么是EventBus?
EventBus是一个Android优化的publish/subscribe消息事件总线简化了应用程序内各个组件间、组件与后台线程间的通信
如:Activites,Fragments,Threads,Services
使用场景
例子:
- 比如网络请求,返回时通过Handler或者BroadCastBeceiver通知更新主线程UI
- N个Fragment之间需要通过Listener(监听)通信
这些需求都可以通过EventBus完成和实现
官方架构图
GitHub地址:
https://github.com/greenrobot/EventBus
导入EventBus库
build,gradle
implementation 'org.greenrobot:eventbus:3.2.0'
EventBus使用
EventBus 使用三步骤
注册/反注册 官方提供的方法,会进入反射里面
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
其实我们实际开发中正确使用EvenBus的方法:
在app build,gradle 的dependencies模块中添加注解依赖库
annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.1.1'
在app build,gradle 的 defaultConfig模块添加
// 给注解处理器传参
javaCompileOptions {
annotationProcessorOptions {
arguments = [ eventBusIndex : 'com.netease.eventbus.demo.MyEventBusIndex' ]
}
}
在自定义的Application中的onCreate方法中添加如下代码即可使用。
EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();
- 定义事件
public static class MessageEvent { /* Additional fields if needed */ }
- 订阅事件(注解 + 方法指定参数)
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};
粘性事件
sticky = true @Subscribe注解中加入:sticky = true
作用:延时消费或者未初始化
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onMessageEvent(UserInfo user) {/* Do something */};
- 发送事件(发送消息)
EventBus.getDefault().post(new MessageEvent());
EventBus订阅方法执行优先级
@Subscribe(threadMode = ThreadMode.MAIN, priority = 1)
public void onMessageEvent(UserInfo user) {
//消费消息/事件
tv.setText(User.toString)
Log.e("mile","onMessageEvent");
};
// priority优先级越高,数值越大。默认都为0
@Subscribe(threadMode = ThreadMode.MAIN, priority = 10)
public void onMessageEvent(UserInfo user) {
//消费消息/事件
tv.setText(User.toString)
Log.e("mile","onMessageEvent");
};
如果两个订阅方法可以同时接收,priority数值越大,优先级越高。默认为0