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)系作者
  • 序言:七十年代末本橙,一起剝皮案震驚了整個濱河市扳躬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖贷币,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件击胜,死亡現(xiàn)場離奇詭異,居然都是意外死亡片择,警方通過查閱死者的電腦和手機潜的,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門骚揍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來字管,“玉大人,你說我怎么就攤上這事信不〕笆澹” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵抽活,是天一觀的道長硫戈。 經(jīng)常有香客問我,道長下硕,這世上最難降的妖魔是什么丁逝? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮梭姓,結(jié)果婚禮上霜幼,老公的妹妹穿的比我還像新娘。我一直安慰自己誉尖,他們只是感情好罪既,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著铡恕,像睡著了一般琢感。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上探熔,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天驹针,我揣著相機與錄音,去河邊找鬼诀艰。 笑死柬甥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的涡驮。 我是一名探鬼主播暗甥,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼捉捅!你這毒婦竟也來了撤防?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤棒口,失蹤者是張志新(化名)和其女友劉穎寄月,沒想到半個月后辜膝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡漾肮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年厂抖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片克懊。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡忱辅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谭溉,到底是詐尸還是另有隱情墙懂,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布扮念,位于F島的核電站损搬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏柜与。R本人自食惡果不足惜巧勤,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弄匕。 院中可真熱鬧颅悉,春花似錦、人聲如沸粘茄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柒瓣。三九已至儒搭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芙贫,已是汗流浹背搂鲫。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留磺平,地道東北人魂仍。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像拣挪,于是被迫代替她去往敵國和親擦酌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

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