1. 程式人生 > >EventBus的詳細講解及使用

EventBus的詳細講解及使用

一、什麼是EventBus

EventBus是Android下高效的釋出/訂閱事件匯流排機制。作用是可以代替傳統的Intent、Handler、Broadcast或介面回撥函式,在Fragment、Activity、Service以及執行緒之間去傳遞資料、執行方法。
EventBus的特點是程式碼簡潔,它是一種釋出訂閱設計模式(Publish/Subsribe),或稱作觀察者設計模式。使用EventBus可以讓模組與模組之間解耦。

二、如何獲取

  1. 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);
    }
  1. 直接跳轉到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作為訂閱函式,如果釋出者是子執行緒則直接執行;如果釋出者不是子執行緒,則建立一個子執行緒再執行。

  1. onEventAsync
    使用這個函式作為訂閱函式,那麼無論事件在哪個執行緒釋出,都會建立新的子執行緒再執行。適用於多個執行緒任務處理,內部由執行緒池管理。

至此,對於EventBus的詳細使用我們先講解到這裡,對於原始碼的分析,我會在下個博文中為大家講解,歡迎大家關注。