EventBus 3.0 體驗

EventBus是用於Android和Java的發佈/訂閱事件總線

這裏寫圖片描述

原理:發佈者發佈事件,訂閱者通過EventBus接收事件,做出相應的響應。

EventBus的優點有:
1.簡化組件間的通信
2.使代碼更加簡潔
3.具有高級特性,如交付線程、訂閱者優先級等
4.框架體積小

EventBus的具體使用
1.定義事件實體類
例如:

public class NightMessageEvent {

    private boolean isNight;

    public NightMessageEvent(boolean isNight) {
        this.isNight = isNight;
    }

    public boolean isNight() {
        return isNight;
    }

    public void setNight(boolean night) {
        isNight = night;
    }
}

類名和類的具體業務由自己決定,我這裏使用了一個Boolean值用於判斷狀態。

2.向EventBus註冊,成爲訂閱者以及解除註冊,並聲明訂閱方法

在需要接收的Activity或者Fragment中註冊和解除註冊:

 @Override
    protected void onStart() {
        super.onStart();
        EventBus.getDefault().register(this);
    }

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

同上,在需要接收的地方做事件的接收:

@Subscribe(threadMode = ThreadMode.POSTING)//我這裏由於是同一個線程,所以用POSTING
    public void onNightEvent(NightMessageEvent nightMessageEvent){
        //這裏是接收到事件後,自己的操作
        boolean night = nightMessageEvent.isNight();
        initNavigationTabBar(night);
    }

3.發送事件:

EventBus.getDefault().post(new NightMessageEvent(true));

在需要發送事件的地方發送即可。

總體用起來真的很簡單方便。

這裏還有一點需要注意:在第二步中用到了一個ThreadMode,它是一個枚舉類型,有着以下幾個類型:

POSTING:表示訂閱方法運行在發送事件的線程。

MAIN:表示訂閱方法運行在UI線程,由於UI線程不能阻塞,因此當使用MAIN的時候,訂閱方法不應該耗時過長。

BACKGROUND:表示訂閱方法運行在後臺線程,如果發送的事件線程不是UI線程,那麼就使用該線程;如果發送事件的線程是UI線程,那麼新建一個後臺線程來調用訂閱方法。

ASYNC:訂閱方法與發送事件始終不在同一個線程,即訂閱方法始終會使用新的線程來運行。

ThreadMode默認是使用POSTING的,如果需要更改設置,可以在添加註解的時候同時爲threadMode賦值。

至於priority 優先級 sticky 粘性事件等用到的時候再說吧

最後提一下,忘了一點,需要先在build.gradle中引入:
compile ‘org.greenrobot:eventbus:3.1.1’

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