Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android資訊 >> Android EventBus 3.0 框架用法詳解

Android EventBus 3.0 框架用法詳解

編輯:Android資訊

看到大家提出的關於Android的問題,有一部分可以用EventBus解決,而也有相當多的人推薦使用EventsBus,因為其和GreenDAO出自一家公司,並且使用它非常的簡單,所以現在很多的互聯網app都會使用EventsBus來進行消息傳遞。

基於此,有很多EventBus的文章,寫的非常的好,但是由於EventBus已經出了3.0版本,而國內的大多數翻譯只是停留在了2.4版本左右,對於那些剛剛接觸EventBus的人,從最新版接觸學習,是最理想的學習路線。

所以,在這兒,我總結下EventBus3.0的用法。

什麼是EventBus

EventBus是一個Android端優化的publish/subscribe消息總線,簡化了應用程序內各組件間、組件與後台線程間的通信。比如請求網絡,等網絡返回時通過Handler或Broadcast通知UI,兩個Fragment之間需要通過Listener通信,這些需求都可以通過 EventBus 實現。

EventBus框架

大家談到EventBus,總會想到greenrobot的EventBus,但是實際上EventBus是一個通用的叫法,例如Google出品的Guava,Guava是一個龐大的庫,EventBus只是它附帶的一個小功能,因此實際項目中使用並不多。用的最多的是greenrobot/EventBus,這個庫的優點是接口簡潔,集成方便,但是限定了方法名,不支持注解。另一個庫square/otto修改自 Guava ,用的人也不少。

這篇博文暫時只討論greenrobot的EventBus庫。

基本用法

很多文章會講到Subscriber,以及Publisher和ThreadMode等概念,我覺得暫時沒有必要,簡單粗暴,直接上代碼:

添加依賴庫:

首先你要為你的app添加依賴庫:

compile 'de.greenrobot:eventbus:3.0.0-beta1'

關於如何添加依賴庫,請參考 Gradle for Android 第三篇( 依賴管理 ) 。

有些人會問為什麼是beta版本,因為eventbus現階段3.0版本只處於beta測試階段。有些人會問如何找到eventbus 3.0.0版本,具體添加:

注冊

舉個例子,你需要在一個activity中注冊eventbus事件,然後定義接收方法,這和Android的廣播機制很像,你需要首先注冊廣播,然後需要編寫內部類,實現接收廣播,然後操作UI,在EventBus中,你同樣需要這麼做。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    EventBus.getDefault().register(this);

}
@Override
protected void onDestroy() {
    super.onDestroy();
    EventBus.getDefault().unregister(this);
}

訂閱者

類似廣播,但是有別於2.4版本,你不必再去約定OnEvent方法開頭了(看不懂沒關系):

@Subscribe(threadMode = ThreadMode.MainThread)
public void helloEventBus(String message){
    mText.setText(message);
}

該操作很簡單,定義了一個hello方法,需要傳入String參數,在其中操作UI操作,注意:我們添加了注解@Subscribe,其含義為訂閱者,在其內傳入了threadMode,我們定義為ThreadMode.MainThread,其含義為該方法在UI線程完成,這樣你就不要擔心拋出異常啦。是不是很簡單?

發布者

既然你在某個地方訂閱了內容,當然就會在某個地方發布消息。舉個例子,你的這個activity需要http請求,而http請求你肯定是在異步線程中操作,其返回結果後,你可以這麼寫:

String json="";
EventBus.getDefault().post(json);

這樣就OK了,你可以試下能否正常運行了!

原理初探

你訂閱了內容,所以你需要在該類注冊EventBus,而你訂閱的方法需要傳入String,即你的接收信息為String類型,那麼在post的時候,你post出去的也應該是String類型,其才會接收到消息。

如果你post的是對象

首先你需要定義一個類似pojo類:

public class MessageEvent {
  public final String name;
  public final String password;
  public MessageEvent(String name,String password) {
    this.name = name;
    this.password=password;
  }
}

然後你post的時候:

EventBus.getDefault().post(new MessageEvent("hello","world"));

當然,你接收的方法也需要改為:

@Subscribe(threadMode = ThreadMode.MainThread)
public void helloEventBus(MessageEvent message){
    mText.setText(message.name);
}

疑問,當你post了消息之後,你的訂閱者有多個,每一個都接收嗎?能否做到指定接收者。

下一章,帶來源碼解析以及EventBus的高級用法;如果大家有興趣,也可帶領大家編寫屬於自己的EventBus框架,敬請期待。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved