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如果被銷毀了,會導致接收事件失敗