EventBus 3.0的用法詳解(一)

這是一個系列,若是你尚未看以前的文章:json

EventBus 3.0的用法詳解(二)segmentfault

看到你們提出的關於Android的問題,有一部分能夠用EventBus解決,而也有至關多的人推薦使用EventsBus,由於其和GreenDAO出自一家公司,而且使用它很是的簡單,因此如今不少的互聯網app都會使用EventsBus來進行消息傳遞。網絡

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

因此,在這兒,我總結下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 ,用的人也很多。ide

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

基本用法

不少文章會講到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框架,敬請期待。

相關文章
相關標籤/搜索