EventBus(3.0)使用总结
2020-11-12 本文已影响0人
怎么快乐
正常使用
implementation "org.greenrobot:eventbus:$eventbus_version"//引入依赖
public static class MessageEvent { /* Additional fields if needed */ } //定义消息
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this); //注册
}
/**
* 在主线程接受消息
**/
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this); //取消注册
}
EventBus.getDefault().post(new MessageEvent()); //发送消息
线程模式
四种模式分别是:POSTING、MAIN、BACKGROUND、ASYNC
设置方式:接受消息方法上的注解 添加threadMode = "线程模式",代码如下
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};
POSTING:默认模式可以不写,只能在同一线程接受,既发送方在哪个线程接收方就在哪个线程
MAIN:无论发布者在哪个线程发送,接收方都在主线程中
BACKGROUND:无论发布者在哪个线程发送,接收方都在子线程中
ASYNC:无论发布者在哪个线程发送,接收方都在都会开辟另一个不同的线程接受消息
粘性广播
使用方式:接收方需要在接受消息方法上的注解 增加 sticky = true,代码如下
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onMessageEvent(MessageEvent event){/* Do something */}
接收方 使用 postSticky() 发送消息,代码如下
EventBus.getDefault().postSticky(new MessageEvent());
设置接受的优先级
使用方式:接收方需要在接受消息方法上的注解 增加 priority = 10,优先级越高接受数据越快,当优先级不想分发事件给低级别的事件时,可以使用 cancelEventDelivery (Object event) 取消事件传递。
注意:只有在threadMode = ThreadMode.POSTING 时 cancelEventDelivery (Object event)方法才有效
@Subscribe(threadMode = ThreadMode.POSTING , priority = 100)
public void onMessageEvent(MessageEvent event){/* Do something */}
优化
上面介绍到的用法,相信大家都是这么写对吧,但是这种用法其实可以优化,因为这样使用EventBus,内部用到了反射机制(不信可以断点看一下EventBus的源码)。
那么怎么优化呢?其实就是使用EventBus的注解处理器,下面我就介绍一下怎么使用。
参考文档:https://greenrobot.org/eventbus/documentation/subscriber-index/
annotationProcessor "org.greenrobot:eventbus-annotation-processor:$eventbus_version" //在gradle中增加
//在app下的gradle中配置
android {
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [ eventBusIndex : 'com.example.myapp.MyEventBusIndex' ]
}
}
}
}
在Application中配置
public class App extends Application {
@Override
public void onCreate() {
super.onCreate();
EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();
}
}
以上三步就完成了EventBus使用注解的配置,发送和接受还按照原来的使用即可 !!!!!