EventBus 3.0的用法詳解

什么是EventBus


EventBus是一個Android端優(yōu)化的publish/subscribe消息總線,簡化了應(yīng)用程序內(nèi)各組件間、組件與后臺線程間的通信。比如請求網(wǎng)絡(luò),等網(wǎng)絡(luò)返回時通過Handler或Broadcast通知UI,兩個Fragment之間需要通過Listener通信,這些需求都可以通過EventBus實現(xiàn)。

EventBus框架


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

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

基本用法


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

添加依賴庫
首先你要為你的app添加依賴庫:
compile 'de.greenrobot:eventbus:3.0.0-beta1'

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

注冊

舉個例子,你需要在一個activity中注冊eventbus事件,然后定義接收方法,這和Android的廣播機制很像,你需要首先注冊廣播,然后需要編寫內(nèi)部類,實現(xiàn)接收廣播,然后操作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方法開頭了(看不懂沒關(guān)系):

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

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

發(fā)布者

既然你在某個地方訂閱了內(nèi)容,當(dāng)然就會在某個地方發(fā)布消息。舉個例子,你的這個activity需要http請求,而http請求你肯定是在異步線程中操作,其返回結(jié)果后,你可以這么寫:

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

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

原理初探

你訂閱了內(nèi)容,所以你需要在該類注冊EventBus,而你訂閱的方法需要傳入String,即你的接收信息為String類型,那么在post的時候,你post出去的也應(yīng)該是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"));

當(dāng)然,你接收的方法也需要改為:

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

疑問,當(dāng)你post了消息之后,你的訂閱者有多個,每一個都接收嗎?能否做到指定接收者。
下一章,EventBus的高級用法。

原文地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • EventBus 3.0的用法詳解(二) 看到大家提出的關(guān)于Android的問題,有一部分可以用EventBus解...
    流水潺湲閱讀 1,326評論 1 5
  • EventBus 3.0的用法詳解(一) 前一篇文章簡單介紹了EventBus 3.0的用法,現(xiàn)在是時候詳解其用法...
    流水潺湲閱讀 699評論 0 2
  • ## 入門 ###簡介 GitHub:EventBus Android optimized event bus t...
    javaBoy_hw閱讀 543評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,590評論 19 139
  • 第四章 袖中刀 一連三天,蘇符都沒有見過徐典,徐紅衣也沒有找過蘇符。 傍晚十分。 蘇符出了徐府,因為有老管家支過聲...
    蘇符閱讀 489評論 0 2

友情鏈接更多精彩內(nèi)容