Android EventBus介紹以及基本使用方法

EventBus簡介

EventBus是一個Android事件發(fā)布/訂閱的框架。主要用來在應用程序內(nèi)各組件間、組件與后臺線程間的通信。
比如網(wǎng)絡請求數(shù)據(jù)返回時原來可以通過Handler或者是Broadcast通知ui,fragment之間的需要添加方法和listener進行回調(diào)通信。這些需求都可以通過eventbus來實現(xiàn)、

Eventbus的三要素

1、Event:事件,可以自定義為任意類型的對象
2、subscriber“事件訂閱者,也就是接收事件的人,在3.0之前消息處理的方法只能限定于OnEvent、onEventMainThread、onEventBackgroundThread和onEventAsync這四個方法,是指定方法名的,也分別代表了四種線程模型。在3.0以后,事件處理的方法名就可以自定義了,但是需要添加注解@Subscribe,并且指定線程模型,默認為posting
3、publisher:事件發(fā)布者,可以在任意線程任意位置中發(fā)送事件,直接調(diào)用post方法,可以自己實例化EventBus對象,但是一般使用EventBus.getDefault()獲取對象就好了,根據(jù)post方法的參數(shù)類型,會自動調(diào)用已經(jīng)注冊的訂閱響應類型事件的函數(shù)

EventBus的四種線程模型(threadMode)

POSTING:默認模型,如果時間處理方法指定了線程模型為POSTING,那么該事件在哪個線程發(fā)出來的事件處理方法就在哪個線程中運行,也就是發(fā)布事件和事件接受處理在同一個線程中。在此模型中的處理方法中要避免執(zhí)行耗時操作,可能會阻塞事件的傳遞,甚至可能會引起ANR
MAIN:事件的處理會在主線程也就是UI線程處理,避免執(zhí)行耗時操作,會引起ANR
BACKGROUND:后臺線程也就是子線程處理,如果事件是在UI線程中發(fā)出來的則會開啟新的線程來處理,如果本身就是在子線程中發(fā)出來的,則在當前子線程進行處理,此模型的事件處理方法中禁止進行UI操作。
ASYNC:無論事件在哪個線程發(fā)布,該事件處理函數(shù)都會在新建的子線程中執(zhí)行,同樣,此事件處理函數(shù)中禁止進行UI更新操作。

使用方法

1、添加引用依賴庫
implementation 'org.greenrobot:eventbus:3.0.0'
2、在需要進行接收事件的對象注冊
EventBus.getDefault.regist(this)
3、創(chuàng)建消息發(fā)送對象

public class EventUser {
    public static final int EVENT_LOGIN_SUCCESS = 0;
    public static final int EVENT_LOGIN_OUT = 1;
    private int action;
    private Object data;

    public EventUser(int action) {
        this.action = action;
    }

    public EventUser(int action, Object data) {
        this.action = action;
        this.data = data;
    }

    public int getAction() {
        return action;
    }

    public void setAction(int action) {
        this.action = action;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

4、發(fā)布消息
Event.getDefault().post(new EventUser(EventUser.EVENT_LOGIN_SUCCESS));
5、接收消息

@Subscribe(threadMode = ThreadMode.MAIN)
public void userEventBus(EventUser userEvent){
    
}

6、解注冊 防止內(nèi)存泄露
EventBus.getDefault().unRegist(this);
粘性事件
之前說的使用方法,都是需要先注冊(register),再post,才能接受到事件;如果你使用postSticky發(fā)送事件,那么可以不需要先注冊,也能接受到事件,也就是一個延遲注冊的過程。 普通的事件我們通過post發(fā)送給EventBus,發(fā)送過后之后當前已經(jīng)訂閱過的方法可以收到。但是如果有些事件需要所有訂閱了該事件的方法都能執(zhí)行呢?例如一個Activity,要求它管理的所有Fragment都能執(zhí)行某一個事件,但是當前我只初始化了3個Fragment,如果這時候通過post發(fā)送了事件,那么當前的3個Fragment當然能收到。但是這個時候又初始化了2個Fragment,那么我必須重新發(fā)送事件,這兩個Fragment才能執(zhí)行到訂閱方法。 粘性事件就是為了解決這個問題,通過 postSticky 發(fā)送粘性事件,這個事件不會只被消費一次就消失,而是一直存在系統(tǒng)中,直到被 removeStickyEvent 刪除掉。那么只要訂閱了該粘性事件的所有方法,只要被register 的時候,就會被檢測到,并且執(zhí)行。訂閱的方法需要添加 sticky = true 屬性。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。