前一篇文章簡單介紹了EventBus 3.0的用法,現在是時候詳解其用法了。首先聲明,EventBus 3.0的改動針對2.4的改動並不是特別大,但是對於其性能的提升是另外一個說法了,所以建議學習EventBus 3.0。
註解
新增的@Subscribe
threadMode = ThreadMode.MainThread
用註解的方式代替約定的方法名規範,是其最大的改變。在2.4中,你可能需要這麼定義:
public void onEventMainThread(MessageEvent event) {
log(event.message);
}
該方法爲接收消息後在主線程中處理事件,而在3.0中:
@Subscribe(threadMode = ThreadMode.MainThread) //在ui線程執行
public void onUserEvent(UserEvent event) {
log(event.message);
}
其中ThreadMode提供了四個常量:
-
MainThread 主線程
-
BackgroundThread 後臺線程
-
Async 後臺線程
-
PostThread 發送線程(默認)
BackgroundThread:當事件是在UI線程發出,那麼事件處理實際上是需要新建單獨線程,如果是在後臺線程發出,那麼事件處理就在該線程。該事件處理方法應該是快速的,避免阻塞後臺線程。
Async:發送事件方不需要等待事件處理完畢。這種方式適用於該事件處理方法需要較長時間,例如網絡請求。
sticky = true
默認情況下,其爲false。什麼情況下使用sticky呢?
相信大多數使用過EventBus 2.4的同學或多或少的使用過:
EventBus.getDefault().postSticky(new VoteEvent(obj));
EventBus.getDefault().registerSticky(this);
你會發現非常的麻煩,那麼在3.0中:
EventBus.getDefault().postSticky(new VoteEvent(obj));
EventBus.getDefault().register(this);
@Subscribe(sticky = true)
什麼時候使用sticy,當你希望你的事件不被馬上處理的時候,舉個栗子,比如說,在一個詳情頁點贊之後,產生一個VoteEvent,VoteEvent並不立即被消費,而是等用戶退出詳情頁回到商品列表之後,接收到該事件,然後刷新Adapter等。其實這就是之前我們用startActivityForResult和onActivityResult做的事情。
priority = 1
相信大部分人知道該用法,值越小優先級越低,默認爲0。
建議
推薦大家在使用EventBus的時候,創建一個事件類,把你的每一個參數(或者可能發生衝突的參數),封裝成一個類:
public class Event {
public static class UserListEvent {
public List<User> users ;
}
public static class ItemListEvent {
public List<Item> items;
}
}
添加processor
按照Markus Junginger的說法(EventBus創作者),在3.0中,如果你想進一步提升你的app的性能,你需要添加:
provided 'de.greenrobot:eventbus-annotation-processor:3.0.0-beta1'
其在編譯的時候爲註冊類構建了一個索引,而不是在運行時,這樣的結果是其讓EventBus 3.0的性能提升了一倍,相比2.4來說,其會是它的3到6倍。大家可以感受下: