EventBus是Android和Java的发布/订阅事件总线。从EventBus3.1开始支持普通Java(非android)项目。GitHub的地址html
为何使用EventBusjava
EventBus的三要素android
EventBus的五种线程模型git
继承结构github
java.lang.Object
org.greenrobot.eventbus.EventBus
复制代码
经常使用方法bash
方法 | 说明 |
---|---|
EventBus.getDefault() | 获取EventBus的实例 |
EventBus.getDefault().register(this) | 在须要的地方调用,订阅注册事件 |
EventBus.getDefault().post(messageEvent) | 发布事件到事件总线 |
@Subscribe(threadMode = ThreadMode.MAIN) | 指定线程模型处理事件 |
EventBus.getDefault().unregister(this) | 取消订阅的事件 |
添加依赖库app
implementation "org.greenrobot:eventbus:3.1.1"
复制代码
自定义一个事件类ide
data class MessageEvent(val message:String)
复制代码
准备订阅器:声明和注释订阅方法,可选地指定线程模式函数
@Subscribe(threadMode = ThreadMode.MAIN)
fun onMessageEvent(event: MessageEvent){ /* Do something */ }
复制代码
在EventBus3.0以前消息处理的方法只能限定于onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,EventBus3.0以后消息处理的方法能够随便取名,可是须要添加一个注解@Subscribe,而且要指定线程模型(默认为POSTING)post
注册和取消订阅事件
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
EventBus.getDefault().register(this)
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
复制代码
发布事件
EventBus.getDefault().post(MessageEvent("发送MessageEvent"))
复制代码
在EventBus中除了普通事件,还支持发送黏性事件,就是在发送事件以后再订阅该事件也能收到该事件
订阅者处理粘性事件
@Subscribe(threadMode = ThreadMode.POSTING, sticky = true)
fun onMessageEvent(event: MessageEvent){ /* Do something */ }
复制代码
发送黏性事件
EventBus.getDefault().postSticky(MessageEvent("发送MessageEvent"))
复制代码
在须要的地方调用,订阅注册事件
EventBus.getDefault().register(this)
复制代码
-keepattributes *Annotation*
-keepclassmembers class * {
@org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}
复制代码