EventBus 3.0的用法詳解(二)

這是一個系列,若是你尚未看以前的文章:segmentfault

EventBus 3.0的用法詳解(一)網絡

前一篇文章簡單介紹了EventBus 3.0的用法,如今是時候詳解其用法了。首先聲明,EventBus 3.0的改動針對2.4的改動並非特別大,可是對於其性能的提高是另一個說法了,因此建議學習EventBus 3.0。app

註解

新增的@Subscribe

threadMode = ThreadMode.MainThread

用註解的方式代替約定的方法名規範,是其最大的改變。在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:發送事件方不須要等待事件處理完畢。這種方式適用於該事件處理方法須要較長時間,例如網絡請求。

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倍。你們能夠感覺下:

圖片描述

相關文章
相關標籤/搜索