一.什么是EventBus
EventBus类似于广播接收者,能够发送和接收事件,实现页面间的通信
二.EventBus的使用
1.添加依赖
compile 'org.greenrobot:eventbus:3.0.0'
2.定义事件
public static class MessageEvent { /* Additional fields if needed */ }
3.接收事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {/* Do something */};
4.注册和解绑事件
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);
}
5.发送事件
EventBus.getDefault().post(new MessageEvent());
三.EventBus3.0线程模型
一共有四种,分别是:
- POSTING (默认) 表示事件处理函数的线程跟发布事件的线程在同一个线程。
- MAIN 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
- BACKGROUND 表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
- ASYNC 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。
四.知识点
@Subscribe(priority = 100)
@Subscribe(sticky = true) //设置接收粘贴事件
优先级高的事件处理函数将先收到发送的事件,可以在优先级高的事件处理函数中拦截事件,不让它继续往下传递,拦截方法如下EventBus.getDefault().cancelEventDelivery(event);
EventBus.getDefault().postSticky(new MovieEvent(1));//发送粘贴事件
五.使用index优化
//module下的build.gradle文件
android{
defaultConfig {
//...省略其他配置
javaCompileOptions {
annotationProcessorOptions {
arguments = [ eventBusIndex : "com.dev.base.MyEventBusIndex" ]
}
}
}
}
dependencies {
compile 'org.greenrobot:eventbus:3.0.0'
annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.0.1'
}
添加以上配置后,编译 运行 项目后,如果在\build\generated\source\apt\debug\项目包名\下生成了你指定的Index类,则表示生成index成功.
六.混淆
#EventBus开始
-keepattributes *Annotation*
#如果使用了EventBus index进行优化加速,就必须加上这个
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
#如果使用了Async类型的线程
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}
#EventBus结束
七.简单封装
public class EventBusManager {
//开启Index加速
public static void openIndex() {
EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();
}
//订阅事件
public static void register(Object subscriber) {
if(!EventBus.getDefault().isRegistered(subscriber)){
EventBus.getDefault().register(subscriber);
}
}
//取消订阅
public static void unregister(Object subscriber) {
if (EventBus.getDefault().isRegistered(subscriber)) {
EventBus.getDefault().unregister(subscriber);
}
}
//终止事件继续传递
public static void cancelDelivery(Object event) {
EventBus.getDefault().cancelEventDelivery(event);
}
//获取保存起来的粘性事件
public static <T> T getStickyEvent(Class<T> classType){
return EventBus.getDefault().getStickyEvent(classType);
}
//删除保存中的粘性事件
public static void removeStickyEvent(Object event) {
EventBus.getDefault().removeStickyEvent(event);
}
//发送事件
public static void postEvent(Object event){
EventBus.getDefault().post(event);
}
//发送粘性事件
public static void postStickyEvent(Object event) {
EventBus.getDefault().postSticky(event);
}
}
本文介绍了EventBus,它类似广播接收者,可实现页面间通信。阐述了其使用步骤,包括添加依赖、定义事件等。还介绍了EventBus3.0的四种线程模型,如POSTING、MAIN等。此外,提及了知识点、使用index优化、混淆和简单封装等内容。
212

被折叠的 条评论
为什么被折叠?



