EventBus 3.0 的使用

首先強調:
/**

     * 註冊一定要放在控件初始化方法之後,使用postSticky的時候,什麼時候註冊,就什麼時候接受數據,所以接收數據之前需要調用的方法要放在註冊語句之前

     */

首先要註冊:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    EventBus.getDefault().unregister(this);
}

然後在發數據的地方:
Bean b = newBean();
EventBus.getDefault().post(b);
搞定

注意
1、post 發佈事件
此處要注意兩個地方:

如果 post 字節數據,此時訂閱者的方法裏參數需爲 Byte,而不是 byte,同樣的,post int數據,訂閱方法參數需爲 Interger,其他基本數據類型同理

如果 post 字符串,那麼所有方法的參數是 String 類型的訂閱者都會接收到事件而執行方法。

2、訂閱者接收事件
訂閱的時候要註冊和取消註冊。

註冊一般是在 onCreate 和 onStart 裏註冊,儘量不要在 onResume,可能出現多次註冊的情況,比如下面這個異常::

EventBusException: Subscriber class already registered to event class
可以先判斷下:

if (!EventBus.getDefault().isRegistered(this)) {
    EventBus.getDefault().register(this);
}

取消註冊 要寫到 onDestroy 方法裏,不要寫到 onStop 裏,有時會出現異常
EventBus 3 採用註解後,方法名沒有限制了,參數只有一個,和發送者 post 的參數對應配對,在未聲明 threadMode 時,默認的線程模式爲 ThreadMode.POSTING,只有在該模式下纔可以取消線程,否則容易導致如下異常:

org.greenrobot.eventbus.EventBusException: This method may only be called from inside event handling methods on the posting thread
由於可在任何地方都可以 post 一個事件,那麼在不同線程之間傳遞事件,比如在工作線程傳遞一個事件更新UI線程中的一個控件,則需要注意 threadMode 的切換。

3、
今天遇到了訂閱事件無法執行的情況,原因:我在activity裏面post,但是註冊的地方士fragment,post的時候fragment還未創建,所以,接收不到,需要用延時操作。

找到原因就好辦了,這時候就需要用到 postSticky。

發佈事件時用 postSticky 操作:

EventBus.getDefault().postSticky(event);
訂閱時,添加 sticky = true

@Subscribe(sticky = true) //看下 @Subscribe 源碼知道 sticky 默認是 false
public void onEvent(Event e) {

}
這裏也有個坑,就是 EventBus.getDefault().register(this); 註冊時最好放到各變量初始化最後,否則可能會出現一些變量空指針異常

在一個activity中倆個方法:
//接受值
@Subscribe(threadMode = ThreadMode.POSTING)
public void getInfo(SearchTagsBean bean){
Log.e(“asd”,bean.getName());
}
//一些點擊事件
private void someThingListener() {
//向另一個activity傳值
mBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().postSticky(query);
}
});
}
這個時候你會驚喜的發現,可以接受到值,也可以傳值,但是當你傳值的時候不光那個activity中的方法接收到了值,發送消息的activity中的接受方法也接受到了值,這可如何是好?
我是通過傳的值的類型不同來解決的,比如一個傳string,一個傳實體類,這樣就不會發生穿線的情況啦

發佈了50 篇原創文章 · 獲贊 8 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章