EventBus 3.0的用法詳解(二)

前一篇文章簡單介紹了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倍。大家可以感受下:

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