EventBus详解
2018-09-19 本文已影响0人
kjy_112233
一、EventBus使用
(1)EventBus作用
- EventBus是一个Android事件发布/订阅轻量级框架。
- 通过解耦发布者和订阅者简化Android事件传递
- EventBus可以代替Android中Intent、Handler、Broadcast或接口函数,在Fragment、Activity、Service线程之间传递数据,执行方法。
- 当和UI交互的时候,无论这个事件是怎么提交的,EventBus都可以在主线程传递事件。
(2)EventBus三要素
- Event事件:它可以是任意类型。
- Subscriber:事件订阅者。在3.0之后事件处理的方法名可以随意取,不过需要加上注解@subscribe(),并且指定线程模型,默认是POSTING。
- Publisher:事件发布者。我们可以在任意线程里发布事件,一般情况下,使用EventBus.getDefault()就可以得到一个EventBus对象,然后再调用post(Object)方法即可。
(3)EventBus线程模型
- POSTING:(默认) 表示事件处理函数的线程跟发布事件的线程在同一个线程。
- MAIN:表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
- BACKGROUND:表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
- ASYNC:表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。
(4)EventBus的基本用法
- 在build.gradle的dependencies中添加如下代码
compile 'org.greenrobot:eventbus:3.1.1'
- 注册事件
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册事件
EventBus.getDefault().register(this);
}
- 解除注册
@Override
protected void onDestroy() {
super.onDestroy();
if(EventBus.getDefault().isRegistered(this)) {
//解除注册
EventBus.getDefault().unregister(this);
}
}
- 发送事件
EventBus.getDefault().post(message);
- 处理事件
- 处理消息的方法名字可以随便取。但是需要加一个注解@Subscribe,并且要指定线程模型。
@Subscribe(threadMode = ThreadMode.MAIN)
public void setMessage(String message) {
//接收message
}
- 发送粘性事件
- 发送事件之后再订阅该事件也能收到该事件,EventBus将一直缓存该粘性事件。
EventBus.getDefault().postSticky(message);
- 移除粘性事件
removeStickyEvent();
removeAllStickyEvents();
- 处理粘性事件
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
public void setMessage(String message) {
//接收message
}
- 代码混淆
-keepattributes *Annotation*
-keepclassmembers class * {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
# And if you use AsyncExecutor:
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
(5)订阅者索引SubscriberIndex使用
- 在gradle文件做以下配置
android {
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [eventBusIndex: 'com.ee.cp.MyEventBusIndex']
}
}
}
}
dependencies {
compile 'org.greenrobot:eventbus:3.1.1'
annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.1.1'
}
- 在MyApplication类中配置
EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();