上一篇文章我們簡單使用了EventBusEventBus3.0使用詳解(上),今天這章我來說說EventBus的粘性事件使用方法,在寫例子之前我們再次了解一下@Subscriber(),在上個例子中我們并沒有添加任何參數,直接空值放入,這是因為在EventBus預設是POSTING線程傳入,如果你要問POSTING是什麼,那麼現在就來告訴你
在EventBus3.0中,有四種線程模型,分别是:
POSTING(預設線程):表示處理消息的線程和釋出消息的線程是同一線程
MAIN(主線程):這個應該不用我多說,看字就知道是主(UI)線程,是以呢不能做耗時操作
BACKGROUND (背景線程):表示事件處理函數的線程在背景線程,是以不能進行UI操作。如果釋出事件的線程是主線程(UI線程),那麼事件處理函數将會開啟一個背景線程,如果果釋出事件的線程是在背景線程,那麼事件處理函數就使用該線程
ASYNC(異步線程) :表示無論事件釋出的線程是哪一個,事件處理函數始終會建立一個子線程運作,同樣不能進行UI操作
介紹完@Subscriber的四種線程模型我們來寫下粘性事件
先增加兩個頁面,分别為FirstActivity和SecondActivity
布局如下圖
firstActivity布局
secondActivity布局
跟普通事件一樣先注冊EventBus,然後在Activity死亡的時候登出
注冊
登出
在跳轉的時候傳遞粘性消息,很多文章都說跳轉Activity的時候EventBus是無法傳遞消息的,因為棧裡沒有該Activity,新打開的Activity因為生命周期的問題無法收到消息,其實用粘性事件是可以發送與接收的,我們先看發送事件
注意箭頭,這個與普通事件的是不一樣的,普通事件直接一個Post,而這個用的是PostSticky,這是發送粘性事件
然後我們看看接收粘性事件
這裡我在@Subscribe這裡增加了一個參數,看大意大家應該明白這個是接收粘性事件,預設的還是POSTING線程,你也可以修改為其他線程,如
其實效果是一樣的
整體運作效果如下
擴充——使用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);
}
}
}
};
}
接收消息與上面例子一樣,運作程式
GitHub位址:EventBus3.0使用詳解Demo歡迎Star
CSDN位址:EventBus3.0Demo位址歡迎下載下傳