Android框架EventBus的使用

在Android之間各組件通信的時候,有時候進行通信不太方便,自己就用到了EventBus。
EventBus主要用於應用程序內各組件間、組件與後臺線程間的通信。
EventBus主要有三個組成部分
事件:(Event)可以是任意類型的對象。通過事件的發佈者將事件進行傳遞。
事件訂閱者(Subscriber):接收特定的事件。
事件發佈者(Publisher):用於通知 Subscriber 有事件發生。可以在任意線程任意位置發送事件

1.需要添加依賴

implementation 'org.greenrobot:eventbus:3.0.0'

2.構造事件消息類(Event),每一個消息類對應一種時間,這裏我門定義了一張圖片的url地址。

public class RandomTimerEvent {
    public String random;

    public RandomTimerEvent(String random) {
        this.random = random;
    }

3.在獲取返回信息的Activity.java中的onCreate進行註冊,在onDestory進行解除註冊。

EventBus.getDefault().register(this);
//在OnDestory中解除註冊
EventBus.getDefault().unregister(this);

4.在需要返回信息的地方寫入

//在這裏我傳入了一個圖片地址url[i]
EventBus.getDefault().post(new RandomTimerEvent(url[i]));

5.在獲取返回信息的Activity.java中獲取信息,這裏是採用了註解的方式

@Subscribe(threadMode = ThreadMode.MAIN)
//這裏我是用了Glide框架加載圖片,Glide框架的最簡單使用加載圖片,不懂得自行百度
public void RandmMsg(RandomTimerEvent randomTimerEvent){
    Glide.with(MainActivity.this).load(randomTimerEvent.random).error(R.mipmap.sb).into(iv);
}

以上就是EventBus的簡單使用了,下面說一下EventBus的進階使用。
1.線程模式
關於ThreadMode一共有四種方式:

PostThread,MainThread,BackgroundThread以及Async。

PostThread:事件的處理在和事件的發送在相同的進程,所以事件處理時間不應太長,不然影響事件的發送線程。
MainThread: 事件的處理會在UI線程中執行。事件處理時間不能太長,長了會造成ANR的。
BackgroundThread:如果事件是在UI線程中發佈出來的,那麼事件處理就會在子線程中運行,如果事件本來就是子線程中發佈出來的,那麼事件處理直接在該子線程中執行。所有待處理事件會被加到一個隊列中,由對應線程依次處理這些事件,如果某個事件處理時間太長,會阻塞後面的事件的派發或處理。
Async:事件處理會在單獨的線程中執行,主要用於在後臺線程中執行耗時操作,每個事件會開啓一個線程。

2.事件的優先級
EventBus事件的優先級類似於廣播的優先級,優先級越高,優先獲得消息。

@Subscribe(priority = 10)
    public void onToastEvent(InfoEvent event){
       Log.e(TAG,"優先級展示");
    }

也可以阻止其他事件的傳遞

@Subscribe(priority = 10)
    public void onToastEvent(InfoEvent event){
       Log.e(TAG,"優先級展示");
       EventBus.getDefault().cancelEventDelivery(event);
    }

3.粘性事件
訂閱在發佈事件之後,但同樣可以收到事件,簡單理解就是,你現在還沒有訂閱,但是之前已經有發佈的事件,當訂閱後,之前發佈的事件可以接收到。舉個例子:當我們打開一個App,我們已經接收到了後臺傳過來需要展示的信息,但是用戶還沒有進行登錄,這個事件已經發布了,用戶還沒有登錄,我們也沒有訂閱,當用戶登錄之後進行訂閱,不需要浪費時間再向後臺請求數據,可以直接獲取信息。粘性時間與普通事件有些區別,下面進行展示。
需要在註解中加入sticky = true

@Subscribe(threadMode = ThreadMode.MAIN,**sticky = true**)
public void RandmMsg(RandomTimerEvent randomTimerEvent){
    Glide.with(MainActivity.this).load(randomTimerEvent.random).error(R.mipmap.sb).into(iv);
}

同樣發佈事件也變了

EventBus.getDefault().postSticky(new RandomTimerEvent(url[i]));

如果不需要粘性事件我們可以進行解除,就是當用戶沒有登錄的時候,進行事件的解除。

EventBus.getDefault().removeStickyEvent(RandomTimerEvent.class);

或者調用移除所有粘性事件

EventBus.getDefault().removeAllStickyEvents();

好了,EventBus的使用暫時就是這些了,如果有不足,或者錯誤,需要補充的,歡迎提出。

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