EventBus3.1用法詳解

EventBus介紹

EventBus是Android和Java的發佈/訂閱事件總線。從EventBus3.1開始支持普通Java(非android)項目。GitHub的地址html

w500

爲何使用EventBusjava

  • 簡化了應用程序內各組件間、組件與後臺線程間的通訊
  • 解耦事件發送方和接收方
  • 開銷小、快、代碼更優雅、體積小(~50k jar)
  • 避免複雜和容易出錯的依賴關係和生命週期問題

EventBus的三要素android

  • Event:事件,能夠是任意類型的對象。
  • Subscriber:事件訂閱者,在EventBus3.0以前消息處理的方法只能限定於onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync。而在EventBus3.0以後,事件處理的方法能夠隨便取名,可是須要添加一個註解@Subscribe,而且要指定線程模型(默認爲POSTING),線程模型下面會講到。
  • Publisher:事件發佈者,能夠在任意線程任意位置發送事件,直接調用EventBus.getDefault().post(Object),根據post函數參數的類型,會自動調用訂閱相應類型事件的函數。

EventBus的五種線程模型git

  • POSTING(默認):若是使用事件處理函數指定了線程模型爲POSTING,那麼該事件在哪一個線程發佈出來的,事件處理函數就會在這個線程中運行,也就是說發佈事件和接收事件在同一個線程。在線程模型爲POSTING的事件處理函數中儘可能避免執行耗時操做,由於它會阻塞事件的傳遞,甚至有可能會引發ANR。
  • MAIN: 事件的處理會在UI線程中執行。事件處理時間不能太長,長了會ANR的。
  • BACKGROUND:若是事件是在UI線程中發佈出來的,那麼該事件處理函數就會在新的線程中運行,若是事件原本就是子線程中發佈出來的,那麼該事件處理函數直接在發佈事件的線程中執行。在此事件處理函數中禁止進行UI更新操做。
  • ASYNC:不管事件在哪一個線程發佈,該事件處理函數都會在新建的子線程中執行,一樣,此事件處理函數中禁止進行UI更新操做
  • MAIN_ORDERED:在EventBus3.1以後新增長的,按照事件的發佈順序同步執行

EventBus經常使用Api

繼承結構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) 取消訂閱的事件

EventBus的使用,註冊普通事件

添加依賴庫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的粘性事件

在EventBus中除了普通事件,還支持發送黏性事件,就是在發送事件以後再訂閱該事件也能收到該事件

訂閱者處理粘性事件

@Subscribe(threadMode = ThreadMode.POSTING, sticky = true)
fun onMessageEvent(event: MessageEvent){ /* Do something */ }
複製代碼

發送黏性事件

EventBus.getDefault().postSticky(MessageEvent("發送MessageEvent"))
複製代碼

在須要的地方調用,訂閱註冊事件

EventBus.getDefault().register(this)
複製代碼

ProGuard 混淆規則

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

參考資料

相關文章
相關標籤/搜索