EventBus之粘性事件(Sticky Events)

Sticky Events

有些事件在事件發佈後攜帶有感興趣的信息。例如,一個事件表示某個初始化已經完成。或者如果你有一些傳感器或位置數據,你想要保持最近的值。您可以使用粘性事件,而不是實現自己的緩存。因此EventBus將某個類型的最後一個粘性事件保存在內存中。然後可以將粘性事件交付給訂閱者或顯式查詢。因此,您不需要任何特殊的邏輯來考慮已經可用的數據。

示例:

可以在訂閱都訂閱之前,首先發送一個粘性事件:

 EventBus.getDefault().postSticky(eventData);

在訂閱者的註冊過程中,所有的粘性訂閱者方法將立即得到之前發佈的粘性事件:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sticky);
        mTvMessage = (TextView) this.findViewById(R.id.tv_message);
        EventBus.getDefault().register(this);
    }

    // UI updates must run on MainThread
    @Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
    public void refreshMessage(final EventData eventData) {
        Log.i(TAG, "method:refreshMessage#eventData=" + eventData);
        mTvMessage.setText("已經接收到 eventData=" + eventData.toString());
    }

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

手動獲取和刪除粘性事件:

正如您所看到的,當匹配的訂閱者註冊時,最後一個粘附事件將自動交付給他們。但有時手動檢查粘性事件可能更方便。此外,可能還需要刪除(消耗)粘性事件,以便不再交付它們。示例:

        EventData stickyEventData = EventBus.getDefault().getStickyEvent(EventData.class);
        // Better check that an event was actually posted before
        if(stickyEventData != null) {
            // "Consume" the sticky event
            EventBus.getDefault().removeStickyEvent(stickyEventData);
            // Now do something with it
        }

方法:removeStickyEvent 重載:當您傳遞類時,它將返回以前保存的粘性事件。使用這個變量,我們可以改進前面的例子:

        EventData stickyEventData = EventBus.getDefault().removeStickyEvent(EventData.class);
        // Better check that an event was actually posted before
        if(stickyEventData != null) {
            // Now do something with it
        }

另外的移除方法:

根據某個事件對象進行移除,如果事件匹配且粘性事件被刪除,則爲true。

        boolean b = EventBus.getDefault().removeStickyEvent(eventData);

移除所有粘性事件:

EventBus.getDefault().removeAllStickyEvents();

 

GitHub地址

由於作者水平有限,語言描述及代碼實現中難免有紕漏,望各位看官多提寶貴意見!

Hello , World !

感謝所有!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章