Eventbus簡單使用

eventbus 常用于組件之間的通信

角色

event 事件,可以是任何類型
subscribe 訂閱者,加上注解@subscribe并且指定線程,默認POSTING
Pubscribe 發(fā)布事件者,以在任意線程 通過 EventBus.getDefault().post()或者EventBus.getDefault().postSticky()

線程模式

POSTING 事件處理函數(shù)和發(fā)布事件同在一個線程
MAIN 表示事件處理在主線程中(ui)線程。所以這個地方不能做耗時操作
BACKGROUND 表示事件處理函數(shù)的線程在后臺線程,因此不能進行UI操作
ASYNC 表示無論事件發(fā)布的線程是哪一個,事件處理函數(shù)始終會新建一個子線程運行,同樣不能進行UI操作

1、在build.gradle引入依賴
implementation 'org.greenrobot:eventbus:3.1.1'
2、定義事件
public class RefreshEvent {

}
3、發(fā)布普通事件

3.1 發(fā)布普通事件

EventBus.getDefault().post(RefreshEvent ())

3.2 注冊事件

override fun onStart() {
  super.onStart()
  EventBus.getDefault().register(this)
}

3.3 取消注冊

override fun onStop() {
  super.onStop()
  EventBus.getDefault().unregister(this)
}

3.4 處理事件

@Subscribe(threadMode = ThreadMode.MAIN)
fun refreshInfo(event: RefreshEvent ) {
     
}
4、發(fā)布粘性事件

4.1 發(fā)送粘性事件

EventBus.getDefault().postSticky(RefreshEvent ())

4.2 注冊事件、取消注冊和普通事件一樣,就是處理事件時候不一樣

@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
fun refreshInfo(event: RefreshEvent) {
     
}

4.3 如果不希望一直接收粘性事件,可以取消粘性事件

@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
fun refreshInfo(event: RefreshEvent) {
     EventBus.getDefault().removeStickyEvent(event)
}
注意事項

1、粘性事件可以接收普通事件
2、使用粘性事件的時候數(shù)據(jù)都是存儲在棧里面,如果棧的數(shù)量達到一定的數(shù)量,會自動調(diào)用EventBus.getDefault().removeStickyEvent(event)移除事件導致后來發(fā)送的事件不會再接收
3、項目中遇到一個這樣問題,在socket中接收數(shù)據(jù)使用的是粘性接收,由于屏幕共享數(shù)據(jù)時候數(shù)據(jù)傳遞比較多會出現(xiàn)在發(fā)送其他消息時候接收不到,這時候就要用eventBus普通事件接收
4、普通事件發(fā)送,接收端的ui必須是可見,不然事件發(fā)送的時候ui如果被銷毀了,會導致接收事件失敗

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容