作為一個
Android
開發者,我們在日常的開發中肯定會使用到EventBus
,比如說當我們在做app
的訊息模組的時候,接收到後臺推送的訊息之後,為了方便使用者檢視,就需要把訊息儲存到本地,正常情況下在頁面上會有個badge
顯示訊息數量,如果我們不在badge
顯示介面的話,就需要在接收到後臺推送之後更新badge
上顯示的訊息數量,這個時候就可以使用EventBus
發出一個事件,這樣訂閱者接收到事件之後,就會從資料庫拿未讀訊息數,顯示在badge
上面。說了這麼多,下面就簡單的介紹下EventBus
的使用:
EventBus
地址:GitHub
一、EventBus 介紹
ventBus
是一個Android
端優化的publish/subscribe
訊息匯流排,簡化了應用程式內各元件間、元件與後臺執行緒間的通訊。這個訊息匯流排主要有三個部分:
- 事件(Event)
- 事件訂閱者(Subscriber)(有沒有想到
RxJava
裡面的訂閱者 ==。) - 事件釋出者(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)
首先在所屬的Activity
的onCreate()
裡面註冊
@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
有下面四種型別:
-
MAIN UI
主執行緒 -
POSTING
預設呼叫方式,在呼叫post方法的執行緒執行,避免了執行緒切換,效能開銷最少 -
BACKGROUND
如果呼叫post
方法的執行緒不是主執行緒,則直接在該執行緒執行。 如果是主執行緒,則切換到後臺單例執行緒,多個方法公用同個後臺執行緒,按順序執行,避免耗時操作 -
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
下面發出事件來測試的。結果是可行的。有興趣的小夥伴可以去看下:
你可以通過以下方式關注我: