Android十八章:EventBus3.0使用

EventBus是一個(gè)在Android優(yōu)化很好的事件總線,他簡(jiǎn)化Android的activity蛆封,fragment唇礁,thread,Service之間通信惨篱,代碼體積小盏筐,質(zhì)量更高。

總之砸讳,他可以代替handler發(fā)送msg和Message接受msg琢融,還可以代替intent在activity界牡,fragment等傳遞msg。

如何使用EventBus

在app/build.gradle

compile 'org.greenrobot:eventbus:3.0.0'

然后在onCreate()注冊(cè)eventbus漾抬,在onDestroy()取消注冊(cè)宿亡。

protected void onCreate(Bundle savedInstanceState){
  EventBus.getDefault().register(MainActivity.this);//注冊(cè)
}
protected void onDestory(){
  EventBus.getDefault().unregister(MainActivity.this);//取消注冊(cè)

}

同時(shí)在注冊(cè)的界面接受msg,這里的方法名可以自定義纳令,只要方法前有@Subscribe的注解挽荠。

@Subscribe
public void getMessage(String msg){
    Log.i(TAG,msg);
}
  • 如果有方法注解了@Subscribe,而沒(méi)先注冊(cè)就會(huì)在日志打印
 No subscribers registered for event class com.ppjun.demo.MessageEvent
 No subscribers registered for event class org.greenrobot.eventbus.NoSubscriberEvent
  • 如果actiivty注冊(cè)了eventbus平绩,而沒(méi)寫一個(gè)方法被@Subscribe注解就會(huì)報(bào)異常
Subscriber class com.ppjun.amapmaster.BActivity and its super classes have no public methods with the @Subscribe annotation

其中@Subscribe注解可以有以下幾種情況:

  • @Subscribe(sticky = true)

代表在activity用postSticky信息之后再注冊(cè)evnetbus圈匆,要用這種sticky=true注解方法來(lái)接受msg,因?yàn)閟ticky默認(rèn)為false的

  • @Subscribe(threadMode = ThreadMode.MAIN)

代表主線程或者子線程post信息的到activity的主線程。

  • @Subscribe(threadMode = ThreadMode.BACKGROUND)

如果發(fā)布線程是主線程捏雌,eventbus就會(huì)用一個(gè)后臺(tái)子線程發(fā)送給主線程跃赚,如果發(fā)布線程是子線程,那么處理方法就在子線程執(zhí)行性湿。最后經(jīng)過(guò)或者不經(jīng)過(guò)線程切換都會(huì)原來(lái)的線程来累。

  • @Subscribe(threadMode = ThreadMode.POSTING)

不需要切換線程,發(fā)布線程和處理線程一樣窘奏。簡(jiǎn)單來(lái)說(shuō)在什么線程post就在什么線程處理。

  • @Subscribe(threadMode = ThreadMode.ASYNC)

處理方法在主線程和發(fā)布線程意外的線程執(zhí)行葫录,處理一些耗時(shí)的操作如網(wǎng)絡(luò)請(qǐng)求着裹。如果有必要還會(huì)開啟線程池。

?

post和postSticky的區(qū)別

一般注冊(cè)后米同,再post信息要用post骇扇,而在沒(méi)注冊(cè)前post信息,這時(shí)候還沒(méi)有Subscriber面粮,就要用postSticky少孝。

Aactivity.java
protected void onCreate(Bundle savedInstanceState){
  EventBus.getDefault().postSticky("msg from A");
  startActivity(new Intent(Aactivity.this,Bactivity.class));

}

Bactivity.java
protected void onCreate(Bundle savedInstanceState){
  EventBus.getDefault().register(this);


}
@Subscribe(sticky = true)   
public void getMessage(String msg){
     Log.i(TAG,msg);//這里打印出 msg from A
}

protected void onDestory(){
  EventBus.getDefault.unregister(this);

}

Subscribers的優(yōu)先級(jí)

要在同一中ThreadMode中 ,默認(rèn)的priority是0熬苍,優(yōu)先級(jí)更高的會(huì)被先執(zhí)行稍走。

@Subscribe(priority=1)
public void getMessage(String a){

}

取消訂閱者Subscriber

通常由優(yōu)先級(jí)更高的訂閱者來(lái)取消低優(yōu)先級(jí)的訂閱者。

@Subscribe
public void onEvent(String msg){
  EventBus.getDefault().cancelEventDelivery(msg);
}

EventBus的混肴

-keepattributes *Annotation*
-keepclassmembers class ** {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }

# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
    <init>(java.lang.Throwable);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末柴底,一起剝皮案震驚了整個(gè)濱河市婿脸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌柄驻,老刑警劉巖狐树,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鸿脓,居然都是意外死亡抑钟,警方通過(guò)查閱死者的電腦和手機(jī)涯曲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)在塔,“玉大人幻件,你說(shuō)我怎么就攤上這事⌒乃祝” “怎么了傲武?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)城榛。 經(jīng)常有香客問(wèn)我揪利,道長(zhǎng),這世上最難降的妖魔是什么狠持? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任疟位,我火速辦了婚禮,結(jié)果婚禮上喘垂,老公的妹妹穿的比我還像新娘甜刻。我一直安慰自己,他們只是感情好正勒,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布得院。 她就那樣靜靜地躺著,像睡著了一般章贞。 火紅的嫁衣襯著肌膚如雪祥绞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天鸭限,我揣著相機(jī)與錄音蜕径,去河邊找鬼。 笑死败京,一個(gè)胖子當(dāng)著我的面吹牛兜喻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赡麦,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼朴皆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了泛粹?” 一聲冷哼從身側(cè)響起车荔,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎戚扳,沒(méi)想到半個(gè)月后忧便,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年珠增,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了超歌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蒂教,死狀恐怖巍举,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情凝垛,我是刑警寧澤懊悯,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站梦皮,受9級(jí)特大地震影響炭分,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剑肯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一捧毛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧让网,春花似錦呀忧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至因篇,卻和暖如春福扬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惜犀。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狠裹,地道東北人虽界。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像涛菠,于是被迫代替她去往敵國(guó)和親莉御。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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

  • 一俗冻、簡(jiǎn)介 EventBus是由greenrobot 組織貢獻(xiàn)的一個(gè)Android事件發(fā)布/訂閱輕量級(jí)框架礁叔。Even...
    Mr丶sorrow閱讀 14,981評(píng)論 0 13
  • 前言:EventBus出來(lái)已經(jīng)有一段時(shí)間了,github上面也有很多開源項(xiàng)目中使用了EventBus迄薄。所以抽空學(xué)習(xí)...
    Kerry202閱讀 1,286評(píng)論 1 2
  • 對(duì)于Android開發(fā)老司機(jī)來(lái)說(shuō)肯定不會(huì)陌生琅关,它是一個(gè)基于觀察者模式的事件發(fā)布/訂閱框架,開發(fā)者可以通過(guò)極少的代碼...
    飛揚(yáng)小米閱讀 1,476評(píng)論 0 50
  • EventBus 是一個(gè)Android端優(yōu)化的 publish/subscribe 消息總線,簡(jiǎn)化了應(yīng)用程序各個(gè)組...
    王世軍Steven閱讀 1,852評(píng)論 4 21
  • 文章基于EventBus 3.0講解讥蔽。首先對(duì)于EventBus的使用上涣易,大多數(shù)人還是比較熟悉的画机。如果你還每次煩于使...
    Hohohong閱讀 2,297評(píng)論 0 6