EventBus初體驗(二)

背景:

上一篇EventBus初探遇到一個問題就是在 startActivity(intent);之後立即發送EventBus.getDefault().post(new MessageEvent(“我是EventBus發送到消息”));這個消息,下個界面時無法接收到消息的,當時心裏一萬隻cnm在翻騰,這nm用起來有多少場景不能用。後來才知道EventBus是有粘性事件的,對,你沒有看錯,是粘性事件,和Android的粘性廣播一個道理。現在就來簡單的研究一下這個東東怎麼用,大神請繞過(http://greenrobot.org/eventbus/documentation/configuration/sticky-events/)。

何爲粘性事件:

看官網如何解釋:Some events carry information that is of interest after the event is posted. For example, an event signals that some initialization is complete. Or if you have some sensor or location data and you want to hold on the most recent values. Instead of implementing your own caching, you can use sticky events. So EventBus keeps the last sticky event of a certain type in memory. Then the sticky event can be delivered to subscribers or queried explicitly. Thus, you don’t need any special logic to consider already available data.

看谷歌如何翻譯:事件發佈後,有些事件攜帶有興趣的信息。 例如,事件表明一些初始化完成。 或者如果您有一些傳感器或位置數據,並且要保持最近的值。 而不是實現自己的緩存,您可以使用粘性事件。 所以EventBus將某個類型的最後一個粘性事件保留在內存中。 然後可以將粘性事件傳遞給用戶或明確查詢。 因此,您不需要任何特殊的邏輯來考慮已經可用的數據。

我的理解就是:EventBus是基於訂閱者模式開發的,那麼就存在訂閱的問題,如果在訂閱前就把消息發送出來了,那麼之後的訂閱者就無法收到消息了,比如本文的背景提到的,這個粘性事件就是把消息保存在內存中,使之後的訂閱者也可以收到這個消息。當然內存保留太多的消息總會影響性能,這個時候就可以使用EvenBus提供的API刪除這些粘性消息。

那麼如何使用呢?很簡單:

使用步驟:

1. 在你發送消息的時候使用
EventBus.getDefault().postSticky(new MessageEvent("我是EventBus發送過來的消息"));替代:
//EventBus.getDefault().post(new MessageEvent("我是EventBus發送到消息"));
2.接收處理消息的時候:
//增加sticky = true這個參數,值爲true,非粘性事件爲true
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
public void getMessage(MessageEvent messageEvent) {
    String getMessage = messageEvent.getMessage;
    tv_receive.setText(getMessage);
}

效果:

如何取消呢?官方提供了幾個重載的方法:

 MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);//獲取事件類型
 if (stickyEvent!=null){
        EventBus.getDefault().removeStickyEvent(stickyEvent);//取消指定類型的消息
 }
 //EventBus.getDefault().removeAllStickyEvents();//移除所有的類型
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章