Android探索與鞏固(Kotlin下的EventBus)
這裡的示例我用了自己的基類和類 ARouter 的路由通訊,基本大同小異,只需要注意EventBus的用法就好。
-
在專案的build.gradle中新增配置:
implementation 'org.greenrobot:eventbus:3.1.1' 複製程式碼
-
新增訊息事件類:
class MessageEvent internal constructor(message: String) { private var message: String? = null init { this.message = message } internal fun getMessage(): String? { return message } fun setMessage(message: String) { this.message = message } } 複製程式碼
-
事件的註冊和取消訂閱
class EventBusActivity : BaseActivity<BasePresenter>(){ val Tag = "EventBusActivity" override fun initWidgets() { tv_message.text = getString(R.string.EventBusActivity) btn_subscription.text = getString(R.string.subscriptionEvent) btn_message.text = getString(R.string.jumpToSecond) } override fun setListeners() { click(btn_message,btn_subscription) } override fun onWidgetsClick(v: View) { when(v){ //RegisteredEvent btn_subscription ->{ if (!EventBus.getDefault().isRegistered(this)){ EventBus.getDefault().register(this) }else{ showToast(getString(R.string.repeatRegistration)) } } btn_message ->{ goActivity(Paths.DemoPage.SecondActivity) } } } override fun bindLayout() = R.layout.activity_eventbus override fun onDestroy() { super.onDestroy() //取消註冊事件 EventBus.getDefault().unregister(this) } 複製程式碼
-
事件訂閱者處理事件
@Subscribe(threadMode = ThreadMode.MAIN) fun Event(messageEvent: MessageEvent) { tv_message.text = messageEvent.getMessage() } 複製程式碼
-
釋出事件
class SecondActivity :BaseActivity<BasePresenter>(){ override fun initWidgets() { tv_message.text = getString(R.string.SecondActivity) btn_subscription.text = getString(R.string.sendStickyEvents) btn_message.text = getString(R.string.sendEvent) } override fun setListeners() { click(btn_message,btn_subscription) } override fun onWidgetsClick(v: View) { when(v){ btn_message ->{ EventBus.getDefault().post(MessageEvent(getString(R.string.wish))) finish() } btn_subscription ->{EventBus.getDefault().postSticky(MessageEvent(getString(R.string.stickyEvents))) finish() } } } override fun bindLayout() = R.layout.activity_eventbus } 複製程式碼
-
粘性事件
EventBus的粘性事件與粘性廣播類似,就是傳送了事件之後再次訂閱該事件也能收到。
@Subscribe(sticky = true) fun StickyEvent(messageEvent: MessageEvent) { tv_message.text = messageEvent.getMessage() } 複製程式碼
訂閱粘性事件與上面相同,傳送粘性事件在上面的程式碼中有。
效果示例
主頁,顯示EventBusActivity,我們首先訂閱事件。然後跳轉到SecondActivity傳送事件。 點擊發送事件
接下來測試粘性事件,首先我們先不訂閱事件,先跳轉到SecondActivity,點擊發送粘性事件。然後我們發現字樣並沒有變化。
這個時候我們訂閱事件,會發現字樣改變。
最後總結
EventBus基本用法就是先建立訊息事件類,然後註冊事件,在Activity中注意最後要取消訂閱。然後建立事件訂閱者處理事件,要注意執行緒模式。最後通過事件釋出者釋出事件,一般使用 EventBus.getDefault().post()釋出。如果遇到在釋出事件後還沒有註冊事件的情況,就使用粘性事件處理。
用法詳解就到這裡了,作為一個渴求真相的小程式設計師,我在之後還要繼續在原理上探索EventBus是如何實現的,到時候如果有什麼心得也會隨時記錄。這是我第一次總結第三方框架使用,如有不妥歡迎指正。另外我的 個人總結demo 已經同步更新了,如果博文有不詳細的地方可以通過demo進一步理解。