這是一個系列,若是你尚未看以前的文章:segmentfault
前一篇文章簡單介紹了EventBus 3.0的用法,如今是時候詳解其用法了。首先聲明,EventBus 3.0的改動針對2.4的改動並非特別大,可是對於其性能的提高是另一個說法了,因此建議學習EventBus 3.0。app
用註解的方式代替約定的方法名規範,是其最大的改變。在2.4中,你可能須要這麼定義:ide
public void onEventMainThread(MessageEvent event) { log(event.message); }
該方法爲接收消息後在主線程中處理事件,而在3.0中:post
@Subscribe(threadMode = ThreadMode.MainThread) //在ui線程執行 public void onUserEvent(UserEvent event) { log(event.message); }
其中ThreadMode提供了四個常量:性能
MainThread 主線程學習
BackgroundThread 後臺線程ui
Async 後臺線程this
PostThread 發送線程(默認)spa
BackgroundThread:當事件是在UI線程發出,那麼事件處理其實是須要新建單獨線程,若是是在後臺線程發出,那麼事件處理就在該線程。該事件處理方法應該是快速的,避免阻塞後臺線程。
Async:發送事件方不須要等待事件處理完畢。這種方式適用於該事件處理方法須要較長時間,例如網絡請求。
默認狀況下,其爲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作的事情。
相信大部分人知道該用法,值越小優先級越低,默認爲0。
推薦你們在使用EventBus的時候,建立一個事件類,把你的每個參數(或者可能發生衝突的參數),封裝成一個類:
public class Event { public static class UserListEvent { public List<User> users ; } public static class ItemListEvent { public List<Item> items; } }
按照Markus Junginger的說法(EventBus創做者),在3.0中,若是你想進一步提高你的app的性能,你須要添加:
provided 'de.greenrobot:eventbus-annotation-processor:3.0.0-beta1'
其在編譯的時候爲註冊類構建了一個索引,而不是在運行時,這樣的結果是其讓EventBus 3.0的性能提高了一倍,相比2.4來講,其會是它的3到6倍。你們能夠感覺下: