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*(**);
}