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);
}
複製代碼