EventBus的詳細講解及使用
一、什麼是EventBus
EventBus是Android下高效的釋出/訂閱事件匯流排機制。作用是可以代替傳統的Intent、Handler、Broadcast或介面回撥函式,在Fragment、Activity、Service以及執行緒之間去傳遞資料、執行方法。
EventBus的特點是程式碼簡潔,它是一種釋出訂閱設計模式(Publish/Subsribe),或稱作觀察者設計模式。使用EventBus可以讓模組與模組之間解耦。
二、如何獲取
- AndroidStudio中之間所有maven依賴eventbus或者build.gradle中新增依賴:
compile ‘de.greenrobot:eventbus:2.4.0’
三、EventBus基本使用(三個步驟)
步驟一:定義一個Event
//隨便定義一個類
public class Event {
public String msg;//定義一個引數
}
步驟二:註冊 & 登出 訂閱者
- 在該介面所在的oncrete()方法中新增:
EventBus.getDefault().register(this);//註冊一個接收
- 實現訂閱方法,主要是重寫四個方法:
public void onEvent(Event event) {
// 接收到事件之後,列印message資訊
Log.i(TAG,"receive onEvent ===" + event.msg+"當前執行緒"+Thread.currentThread());
}
public void onEventMainThread(Event event) {
// 接收到事件之後,列印message資訊
Log.i(TAG,"receive onEventMainThread ===" + event.msg+"當前執行緒"+Thread.currentThread());
}
public void onEventBackgroundThread(Event event) {
// 接收到事件之後,列印message資訊
Log.i(TAG,"receive onEventBackgroundThread ===" + event.msg+"當前執行緒"+Thread.currentThread());
}
public void onEventAsync(Event event) {
// 接收到事件之後,列印message資訊
Log.i(TAG,"receive onEventAsync ===" + event.msg+"當前執行緒"+Thread.currentThread());
}
步驟三:釋出者釋出事件
Event event1 = new Event();//該Event 就是我們之前建立的一個類
event1.msg = "我是來自TestEvent的訊息";
EventBus.getDefault().post(event1);//在子執行緒中釋出訊息
四、EventBus基本測試
1、當我們在同一個Activity中註冊監聽,併發布事件時:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_2:
// 釋出事件
*//* Event event1 = new Event();
event1.msg = "我是來自TestEvent的訊息";
EventBus.getDefault().post(event1);//在子執行緒中釋出訊息*//*
break;
}
return super.onKeyDown(keyCode, event);
}
當我們點選鍵盤的“2”時,Android Monitor會列印如下的提示:
2、當我們在同一個Activity中註冊監聽,並在其建立一個子執行緒釋出事件時:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_2:
// 釋出事件
new Thread(new Runnable() {
@Override
public void run() {
*//* Event event1 = new Event();
event1.msg = "我是來自TestEvent的訊息";
EventBus.getDefault().post(event1);//在子執行緒中釋出訊息*//*
}
}).start();
break;
}
return super.onKeyDown(keyCode, event);
}
列印的訊息如下:
3、當我們在同一個Activity中註冊監聽,在另一個Activity中釋出事件時:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_2:
// 釋出事件
Event event1 = new Event();
event1.msg = "我是來自TestEvent的訊息";
EventBus.getDefault().post(event1);//在子執行緒中釋出訊息
break;
}
return super.onKeyDown(keyCode, event);
}
- 直接跳轉到B介面
這個時候我們由Main介面跳轉到B介面,但是我們仍然在Main中列印資訊(作為接受者)。如果我們直接點選調轉,然後按“2”釋出事件時,列印如下:
2.跳轉後,我們點選返回鍵,然後再次跳轉後顯示:
五、EventBus四個方法講解
總結:
通過上面的四個方法的分析,我們結合上面的測試,我們再次詳細講解四個關鍵方法的使用。
1. onEvent:
如果使用onEvent作為訂閱函式,那麼該事件在哪個執行緒釋出出來的,onEvent就會在這個執行緒中執行,也就是說釋出事件和接收事件執行緒在同一個執行緒。
2. onEventMainThread
如果使用onEventMainThread作為訂閱函式,那麼不論事件是在哪個執行緒中釋出出來的,onEventMainThread都會在UI執行緒中執行,接收事件就會在UI執行緒中執行,這個在Android中是非常有用的,因為在Android中只能在UI執行緒中跟新UI,所以在onEvnetMainThread方法中是不能執行耗時操作的。
3. onEventBackgroundThread
使用onEventBackgrond作為訂閱函式,如果釋出者是子執行緒則直接執行;如果釋出者不是子執行緒,則建立一個子執行緒再執行。
- onEventAsync
使用這個函式作為訂閱函式,那麼無論事件在哪個執行緒釋出,都會建立新的子執行緒再執行。適用於多個執行緒任務處理,內部由執行緒池管理。
至此,對於EventBus的詳細使用我們先講解到這裡,對於原始碼的分析,我會在下個博文中為大家講解,歡迎大家關注。