EventBus一之基本使用
程序员文章站
2022-06-09 23:45:48
...
常见事件传递方式
EventBus是什么
EventBus is a publish/subscribe event bus for Android and Java.
EventBus使用场景
a.简化组件间,组件与后台线程的通讯。
b.解耦消息的发送方与接收方
官方架构图
github地址
implementation 'org.greenrobot:eventbus:3.1.1'
使用三个步骤
1)定义一个事件
public class MessageEvent {
public String text;
}
2)订阅事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
3)发布事件
MessageEvent msg = new MessageEvent();
EventBus.getDefault().post(msg);
使用注解处理的EventBus
上述的使用方式,利用了反射遍历获取订阅方法的实现,正确使用EventBus,可以使用注解处理,避免反射遍历。
1)配置gradle 支持注解处理器
android {
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [ eventBusIndex : 'com.example.myapp.MyEventBusIndex' ]
}
}
}
}
dependencies {
implementation 'org.greenrobot:eventbus:3.1.1'
annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.1.1'
}
2)订阅事件并且build project
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
注解处理器会自动生成SubscriberInfoIndex类
/** This class is generated by EventBus, do not edit. */
public class MyEventBusIndex implements SubscriberInfoIndex {
private static final Map<Class<?>, SubscriberInfo> SUBSCRIBER_INDEX;
static {
SUBSCRIBER_INDEX = new HashMap<Class<?>, SubscriberInfo>();
putIndex(new SimpleSubscriberInfo(MainActivity.class, true, new SubscriberMethodInfo[] {
new SubscriberMethodInfo("handleMessageEvent", com.canjun.eventbus1.msg.MessageEvent.class,
ThreadMode.MAIN),
}));
}
private static void putIndex(SubscriberInfo info) {
SUBSCRIBER_INDEX.put(info.getSubscriberClass(), info);
}
@Override
public SubscriberInfo getSubscriberInfo(Class<?> subscriberClass) {
SubscriberInfo info = SUBSCRIBER_INDEX.get(subscriberClass);
if (info != null) {
return info;
} else {
return null;
}
}
}
3)使用生成类
EventBus eventBus = EventBus.builder().addIndex(new MyEventBusIndex()).build();
如果要使用单例,则:
EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();
EventBus eventBus = EventBus.getDefault();
事件
粘性事件
场景:
当事件的发送方发送一个类型的事件,并且期望未来订阅该类型事件的方法,也要处理当前的这个事件。此时,发送方需要发送一个粘性事件,并且要求订阅方也要声明处理函数可以接受粘性事件
//发送方
EventBus.getDefault().postSticky(msg);
//接收方
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
public void handleMessageEvent(MessageEvent msg){
Toast.makeText(MainActivity.this,msg.text,0).show();
}
事件的优先级
事件的优先级,决定了订阅方法处理的先后顺序。优先级的值越高,越优先处理。默认的值为0
@Subscribe(threadMode = ThreadMode.MAIN,priority = 1)
public void handleMessageEvent(MessageEvent msg){
Toast.makeText(MainActivity.this,msg.text,0).show();
}