Android基礎 EventBus3 0實用教程

smartsean發表於2017-12-20

作為一個Android開發者,我們在日常的開發中肯定會使用到EventBus,比如說當我們在做app的訊息模組的時候,接收到後臺推送的訊息之後,為了方便使用者檢視,就需要把訊息儲存到本地,正常情況下在頁面上會有個badge顯示訊息數量,如果我們不在badge顯示介面的話,就需要在接收到後臺推送之後更新badge上顯示的訊息數量,這個時候就可以使用EventBus發出一個事件,這樣訂閱者接收到事件之後,就會從資料庫拿未讀訊息數,顯示在badge上面。說了這麼多,下面就簡單的介紹下EventBus的使用:

EventBus地址:GitHub

一、EventBus 介紹

ventBus是一個Android端優化的publish/subscribe訊息匯流排,簡化了應用程式內各元件間、元件與後臺執行緒間的通訊。這個訊息匯流排主要有三個部分:

  1. 事件(Event)
  2. 事件訂閱者(Subscriber)(有沒有想到RxJava裡面的訂閱者 ==。)
  3. 事件釋出者(Publisher)

官方的關係圖

官方關係圖

特徵敘述:

  • 簡化元件間的通訊
    • 事件傳送者和接收者解耦
    • 在活動、片段和後臺執行緒中執行良好
    • 避免了複雜、易出錯的依賴關係和生命週期問題
  • 使你的程式碼更加簡單
  • 快!
  • 小!(大約50K)
  • 在100,000,000+個程式上使用
  • 先進特徵,比如指定執行緒、設定優先順序等

二、使用EventBus僅需四步

1. 新增依賴

使用Gradle

compile 'org.greenrobot:eventbus:3.0.0'
複製程式碼

或者Maven

<dependency>
    <groupId>org.greenrobot</groupId>
    <artifactId>eventbus</artifactId>
    <version>3.0.0</version>
</dependency>
複製程式碼

又或者下載Jar包新增到專案中 jar包下載

2. 定義事件(Event)

public class TestMsg {
}

複製程式碼

這個TestMsg由從事件釋出者發出,到事件訂閱者接收,當然也可以加上額外的資訊,比如下面可以傳遞name

public class TestMsg {
    private String name;

    public TestMsg(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
複製程式碼

3. 定義事件接收者(Subscriber)

首先在所屬的ActivityonCreate()裡面註冊

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_lib);
        EventBus.getDefault().register(this);
    }
複製程式碼

onDestory裡面取消註冊

@Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
    }
複製程式碼

然後定義處理事件:

@Subscribe(threadMode = ThreadMode.MAIN)
    public void onEventMainThread(TestMsg testMsg) {

        if (testMsg != null) {
            Log.d("MainActivity", "你收到的名字為: "+testMsg.getName());
        }
    }
複製程式碼

這裡的定義了事件接收者以及使用註解@Subscribe(threadMode = ThreadMode.MAIN)指定了執行的執行緒。ThreadMode有下面四種型別:

  1. MAIN UI主執行緒

  2. POSTING 預設呼叫方式,在呼叫post方法的執行緒執行,避免了執行緒切換,效能開銷最少

  3. BACKGROUND 如果呼叫post方法的執行緒不是主執行緒,則直接在該執行緒執行。 如果是主執行緒,則切換到後臺單例執行緒,多個方法公用同個後臺執行緒,按順序執行,避免耗時操作

  4. ASYNC 開闢新獨立執行緒,用來執行耗時操作,例如網路訪問。

當然這裡可以在註解裡面設定優先順序,比如下面設定優先順序為100,越大就越線先接收到事件:

@Subscribe(threadMode = ThreadMode.POSTING,priority = 100)
    public void onEventMainThread(TestMsg testMsg) {

        if (testMsg != null) {
            Log.d("MainActivity", "你收到的名字為: "+testMsg.getName());
        }
    }
複製程式碼

如果你有三個接收事件,並且設定了不同的優先順序,比如100、50、10,你也可以在priority = 100的接收到之後取消事件的傳遞,那麼priority = 50和10的就不會接收到事件了。但是請注意,只能在ThreadMode.PostThread型別的才能取消,其他的三種ThreadMode型別是不能取消的。

如何設定:

EventBus.getDefault().cancelEventDelivery(event) ;
複製程式碼

4.定義事件釋出者(Publisher)發出事件

sendMessage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EventBus.getDefault().post(new TestMsg("測試EventBus"));
            }
        });
複製程式碼

我寫了一個小Demo,這個Demo是我在主module,也就是在app下面定義了事件接收者,在主app依賴的module下面發出事件來測試的。結果是可行的。有興趣的小夥伴可以去看下:

Demo地址

你可以通過以下方式關注我:

  1. CSDN
  2. 掘金
  3. 個人部落格

相關文章