【Android 進階】EventBus---超級方便的工具

EventBus是什麼?有什麼用處?

EventBus是一款針對Android優化的發佈/訂閱(publish/subscribe)事件總線。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,線程之間傳遞消息。簡化了應用程序內各組件間、組件與後臺線程間的通信。優點是開銷小,代碼更優雅。以及將發送者和接收者解耦。比如請求網絡,等網絡返回時通過Handler或Broadcast通知UI,兩個Fragment之間需要通過Listener通信,這些需求都可以通過EventBus實現。

開源地址

https://github.com/greenrobot/EventBus

一般使用步驟

1)添加jar包到libs文件夾下

這裏寫圖片描述

2)註冊(在需要接受到數據的Activity)

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
}

3)解註冊(在需要接受到數據的Activity)

@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}

4)構造 發送消息 類(另外建立一個class)

public class MessageEvent {
public String name;
public String password;
public MessageEvent(String name, String password) {
this.name = name;
this.password = password;
}
}

5)發佈消息(不需要在該調用所在的Activity裏註冊和解註冊)

EventBus.getDefault().post(new MessageEvent(“veyron”,”123”));

6)接收信息類(當然是在你註冊和解註冊的那個Activity裏面)

@Subscribe(threadMode = ThreadMode.MAIN)
public void messageEventBus(MessageEvent event){
tv_result.setText(“name:”+event.name+” passwrod:”+event.password);
}

其中:

接收方法類型:
ThreadMode.MAIN 表示這個方法在主線程中執行,就是事件的處理會在UI線程中執行。事件處理時間不能太長,這個不用說的,長了會ANR的。

ThreadMode.BACKGROUND :事件處理是在後臺線程,但事件處理時間還是不應該太長,因爲如果發送事件的線程是後臺線程,會直接執行事件,如果當前線程是UI線程,事件會被加到一個隊列中,由一個線程依次處理這些事件,如果某個事件處理時間太長,會阻塞後面的事件的派發或處理。不能併發處理。

ThreadMode.ASYNC :事件處理會在單獨的線程中執行,主要用於在後臺線程中執行耗時操作,每個事件會開啓一個線程(有線程池),但最好限制線程的數目。異步併發處理。

ThreadMode.POSTING: 事件的處理和事件的發送在相同的進程,所以事件處理時間不應太長,不然影響事件的發送線程,而這個線程可能是UI線程。

注意:

假設ActivityA想通過EventBus向ActivityB發送數據。準備好發送消息類,在ActivityB裏面分別註冊和解註冊,然後準備接收消息類。這時候從
ActivityA點擊按鈕開啓ActivityB,發現接收消息類是接收不到數據的。
原因就是一般事件必須先註冊,再發送數據。也就是說ActivityB必須先開啓,所以問題就是:通過ActivityA 開啓ActivityB(本身沒有先開啓,所以接收不到數據)。
這並不是我們想要的結果對吧?那麼看下面的黏性事件。

黏性事件以及使用步驟

之前說的使用方法, 都是需要先註冊(register), 再post,才能接受到事件;
如果你使用postSticky發送事件, 那麼可以不需要先註冊, 也能發送信息,但是最後還是需要註冊了纔可以接收到數據。這種方式也是符合我們大衆的需求以及思維習慣。

1)構造 發送信息 類

public class StickyEvent {
public String msg;
public StickyEvent(String msg) {
this.msg = msg;
}
}

2)發佈黏性消息類

EventBus.getDefault().postSticky(new StickyEvent(“這個是粘性事件”));

3)接收消息類

//注意,和之前的方法一樣,只是多了一個 sticky = true 的屬性.
@Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
public void onEvent(StickyEvent event){
tv_c_result.setText(event.msg);
}

4)註冊:才真正接收信息,或者說開啓接收權限,接收信息代碼纔會執行。

EventBus.getDefault().register(Activity.this);

5)解註冊

EventBus.getDefault().removeAllStickyEvents();
EventBus.getDefault().unregister(Activity.class);

索引加速:

3.0 後引入了索引加速(默認不開啓)的功能,即通過 apt 編譯插件的方式,在代碼編譯的時候對註解進行索引,避免了以往通過反射造成的性能損耗。
如何使用可以參考官方文檔

Proguard處理:

#EventBus
 -keepclassmembers class ** {
    public void onEvent*(**);
    void onEvent*(**);
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章