EventBus 3.0的用法詳解(一)

EventBus 3.0的用法詳解(二)

看到大家提出的關(guān)于Android的問題澈侠,有一部分可以用EventBus解決延旧,而也有相當(dāng)多的人推薦使用EventsBus,因為其和GreenDAO出自一家公司,并且使用它非常的簡單葵礼,所以現(xiàn)在很多的互聯(lián)網(wǎng)app都會使用EventsBus來進(jìn)行消息傳遞号阿。

基于此,有很多EventBus的文章章咧,寫的非常的好倦西,但是由于EventBus已經(jīng)出了3.0版本,而國內(nèi)的大多數(shù)翻譯只是停留在了2.4版本左右赁严,對于那些剛剛接觸EventBus的人扰柠,從最新版接觸學(xué)習(xí),是最理想的學(xué)習(xí)路線疼约。

所以卤档,在這兒,我總結(jié)下EventBus3.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 第三篇( 依賴管理 )巨税。

有些人會問為什么是beta版本,因為eventbus現(xiàn)階段3.0版本只處于beta測試階段粉臊。有些人會問如何找到eventbus 3.0.0版本草添,具體添加:


注冊

舉個例子,你需要在一個activity中注冊eventbus事件扼仲,然后定義接收方法远寸,這和Android的廣播機(jī)制很像,你需要首先注冊廣播屠凶,然后需要編寫內(nèi)部類驰后,實現(xiàn)接收廣播,然后操作UI,在EventBus中矗愧,你同樣需要這么做灶芝。

@Override

protectedvoidonCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

EventBus.getDefault().register(this);

}

@Override

protectedvoidonDestroy() {

super.onDestroy();

EventBus.getDefault().unregister(this);

}

訂閱者

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

@Subscribe(threadMode =ThreadMode.MainThread)

publicvoidhelloEventBus(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(Stringname,String password) {

this.name = name;

this.password=password;

}

}


然后你post的時候:

EventBus.getDefault().post(newMessageEvent("hello","world"));

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

@Subscribe(threadMode =ThreadMode.MainThread)

public void helloEventBus(MessageEventmessage){

mText.setText(message.name);

}


疑問,當(dāng)你post了消息之后废睦,你的訂閱者有多個伺绽,每一個都接收嗎?能否做到指定接收者嗜湃。

原文

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奈应,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子净蚤,更是在濱河造成了極大的恐慌钥组,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件今瀑,死亡現(xiàn)場離奇詭異程梦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)橘荠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門屿附,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哥童,你說我怎么就攤上這事挺份。” “怎么了贮懈?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵匀泊,是天一觀的道長优训。 經(jīng)常有香客問我,道長各聘,這世上最難降的妖魔是什么揣非? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮躲因,結(jié)果婚禮上早敬,老公的妹妹穿的比我還像新娘。我一直安慰自己大脉,他們只是感情好搞监,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著镰矿,像睡著了一般琐驴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秤标,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天棍矛,我揣著相機(jī)與錄音,去河邊找鬼抛杨。 笑死,一個胖子當(dāng)著我的面吹牛荐类,可吹牛的內(nèi)容都是我干的怖现。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼玉罐,長吁一口氣:“原來是場噩夢啊……” “哼屈嗤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吊输,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤饶号,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后季蚂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茫船,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年扭屁,在試婚紗的時候發(fā)現(xiàn)自己被綠了算谈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡料滥,死狀恐怖然眼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情葵腹,我是刑警寧澤高每,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布屿岂,位于F島的核電站,受9級特大地震影響鲸匿,放射性物質(zhì)發(fā)生泄漏爷怀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一晒骇、第九天 我趴在偏房一處隱蔽的房頂上張望霉撵。 院中可真熱鬧,春花似錦洪囤、人聲如沸徒坡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喇完。三九已至,卻和暖如春剥啤,著一層夾襖步出監(jiān)牢的瞬間锦溪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工府怯, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留刻诊,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓牺丙,卻偏偏與公主長得像则涯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子冲簿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

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

  • EventBus 是一個Android端優(yōu)化的 publish/subscribe 消息總線,簡化了應(yīng)用程序各個組...
    王世軍Steven閱讀 1,846評論 4 21
  • 項目到了一定階段會出現(xiàn)一種甜蜜的負(fù)擔(dān):業(yè)務(wù)的不斷發(fā)展與人員的流動性越來越大粟判,代碼維護(hù)與測試回歸流程越來越繁瑣。這個...
    fdacc6a1e764閱讀 3,174評論 0 6
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理峦剔,服務(wù)發(fā)現(xiàn)档礁,斷路器,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 前言:EventBus出來已經(jīng)有一段時間了吝沫,github上面也有很多開源項目中使用了EventBus呻澜。所以抽空學(xué)習(xí)...
    Kerry202閱讀 1,282評論 1 2
  • 對于Android開發(fā)老司機(jī)來說肯定不會陌生,它是一個基于觀察者模式的事件發(fā)布/訂閱框架野舶,開發(fā)者可以通過極少的代碼...
    飛揚小米閱讀 1,473評論 0 50