天天看點

EventBus3.0內建使用詳解(下)

上一篇文章我們簡單使用了EventBusEventBus3.0使用詳解(上),今天這章我來說說EventBus的粘性事件使用方法,在寫例子之前我們再次了解一下@Subscriber(),在上個例子中我們并沒有添加任何參數,直接空值放入,這是因為在EventBus預設是POSTING線程傳入,如果你要問POSTING是什麼,那麼現在就來告訴你

在EventBus3.0中,有四種線程模型,分别是:

POSTING(預設線程):表示處理消息的線程和釋出消息的線程是同一線程

MAIN(主線程):這個應該不用我多說,看字就知道是主(UI)線程,是以呢不能做耗時操作

BACKGROUND (背景線程):表示事件處理函數的線程在背景線程,是以不能進行UI操作。如果釋出事件的線程是主線程(UI線程),那麼事件處理函數将會開啟一個背景線程,如果果釋出事件的線程是在背景線程,那麼事件處理函數就使用該線程

ASYNC(異步線程) :表示無論事件釋出的線程是哪一個,事件處理函數始終會建立一個子線程運作,同樣不能進行UI操作

介紹完@Subscriber的四種線程模型我們來寫下粘性事件

先增加兩個頁面,分别為FirstActivity和SecondActivity

布局如下圖

EventBus3.0內建使用詳解(下)

                                                                                                     firstActivity布局

EventBus3.0內建使用詳解(下)

                                                                                                    secondActivity布局

跟普通事件一樣先注冊EventBus,然後在Activity死亡的時候登出

注冊

EventBus3.0內建使用詳解(下)

登出

EventBus3.0內建使用詳解(下)

在跳轉的時候傳遞粘性消息,很多文章都說跳轉Activity的時候EventBus是無法傳遞消息的,因為棧裡沒有該Activity,新打開的Activity因為生命周期的問題無法收到消息,其實用粘性事件是可以發送與接收的,我們先看發送事件

EventBus3.0內建使用詳解(下)

注意箭頭,這個與普通事件的是不一樣的,普通事件直接一個Post,而這個用的是PostSticky,這是發送粘性事件

然後我們看看接收粘性事件

EventBus3.0內建使用詳解(下)

這裡我在@Subscribe這裡增加了一個參數,看大意大家應該明白這個是接收粘性事件,預設的還是POSTING線程,你也可以修改為其他線程,如

EventBus3.0內建使用詳解(下)

其實效果是一樣的

整體運作效果如下

EventBus3.0內建使用詳解(下)

擴充——使用EventBus代替廣播傳遞消息

先寫一個Service在背景運作,并建立一個線程模拟在特定條件下模拟發送廣播,具體代碼如下:

public class MyService extends Service {

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        try {
            runnable.run();
        } catch (Exception e) {

        }

    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            /**
             * 線程啟動後,模拟特定條件發送廣播
             */
            MessageEvent messageEvent = new MessageEvent();
            for (int i = 0; i < 100; i++) {
                if (i % 13 == 0) {
                    messageEvent.setMessage("i=" + i + ",");
                    //發送消息
                    EventBus.getDefault().post(messageEvent);
                } else if (i == 99) {
                    messageEvent.setMessage("我是最後一條資料");
                    //發送消息
                    EventBus.getDefault().post(messageEvent);
                }
            }
        }
    };


}
           

接收消息與上面例子一樣,運作程式

EventBus3.0內建使用詳解(下)

GitHub位址:EventBus3.0使用詳解Demo歡迎Star

CSDN位址:EventBus3.0Demo位址歡迎下載下傳