什麼是EventBus 由greenrobot組織貢獻(該組織還貢獻了greenDAO),一個Android事件發佈/訂閱輕量級框架,功能:通過解耦發佈者和訂閱者簡化Android事件傳遞,EventBus可以代替Android傳統的Intent,Handler,Broadcast或介面函數,在Fr ...
什麼是EventBus
由greenrobot組織貢獻(該組織還貢獻了greenDAO),一個Android事件發佈/訂閱輕量級框架,功能:通過解耦發佈者和訂閱者簡化Android事件傳遞,EventBus可以代替Android傳統的Intent,Handler,Broadcast或介面函數,在Fragment,Activity,Service線程之間傳遞數據,執行方法。特點:代碼簡潔,是一種發佈訂閱設計模式(觀察者設計模式)。如何使用
首先gradle中引入
compile 'org.greenrobot:eventbus:3.0.0'
EventBus常用的有三個函數
1.註冊事件,註冊過的類能夠接受EventBus發出的消息事件.
EventBus.getDefault().register(this);
2.取消註冊
EventBus.getDefault().unregister(this);
3.發出消息,在任意一個活動或服務中調用該方法傳遞數據,所有註冊過事件的類都能收到消息,參數為object類型,在事件處理函數中強制轉換
EventBus.getDefault().post("你好");
4.事件處理函數,在註冊過EventBus的類中用該函數處理post傳遞的數據。函數名可為任意的,只需用註解聲明(僅限於EventBus3.0,3.0開始支持註解,之前的版本函數為固定的幾個函數),下麵解釋threadMode參數
@Subscribe(threadMode = ThreadMode.MAIN) public void XXX(String str){ Log.d("LoginActivity",str); }
事件處理函數詳解
1.參數含義,threadMode共有4個參數,標識函數在哪個地方運行,比如主線程或者子線程。
- POSTING(預設):如果使用事件處理函數指定了線程模型為POSTING,那麼該事件在哪個線程發佈出來的,事件處理函數就會在這個線程中運行,也就是說發佈事件和接收事件在同一個線程。線上程模型為POSTING的事件處理函數中儘量避免執行耗時操作,因為它會阻塞事件的傳遞,甚至有可能會引起ANR。MAIN:
- 事件的處理會在UI線程中執行。事件處理時間不能太長,長了會ANR的。
- BACKGROUND:如果事件是在UI線程中發佈出來的,那麼該事件處理函數就會在新的線程中運行,如果事件本來就是子線程中發佈出來的,那麼該事件處理函數直接在發佈事件的線程中執行。在此事件處理函數中禁止進行UI更新操作。
- ASYNC:無論事件在哪個線程發佈,該事件處理函數都會在新建的子線程中執行,同樣,此事件處理函數中禁止進行UI更新操作。耗時操作應該使用本模式
2.事件優先順序。在相同的線程模式下,高優先順序的訂閱者將會比低優先順序的訂閱者更早接收到事件。EventBus預設的優先順序是0,這樣高優先順序事件處理完時間後可以使用cancelEventDelivery(object),阻斷消息的傳播。
註意:優先順序不會影響不同線程模式下的訂閱者接收事件的順序。
@Subscribe(threadMode = ThreadMode.MAIN,priority = 1)
public void XXX(object o){
//處理邏輯
//阻斷傳遞
cancelEventDelivery(object);
}
粘性事件
簡單的說粘性事件就是在發佈粘性消息後,再在某個類中註冊EventBus,聲明一個粘性事件處理函數任然可以接收到之前發佈的粘性事件。
1.發佈事件,註意這裡是postSticky
EventBus.getDefault().postSticky("Hello everyone!");
2.註冊Eventbus,和之前一樣
EventBus.getDefault().register(this);
3.處理消息,註意在註解參數中聲明:sticky:true,表示該事件能夠接受粘性事件
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN) public void onEvent(String event) { Log.d("EventBus",event); }