Android十八章:EventBus3.0使用

EventBus是一個(gè)在Android優(yōu)化很好的事件總線,他簡化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()注冊eventbus,在onDestroy()取消注冊。

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

}

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

@Subscribe
public void getMessage(String msg){
    Log.i(TAG,msg);
}
  • 如果有方法注解了@Subscribe,而沒先注冊就會(huì)在日志打印
 No subscribers registered for event class com.ppjun.demo.MessageEvent
 No subscribers registered for event class org.greenrobot.eventbus.NoSubscriberEvent
  • 如果actiivty注冊了eventbus,而沒寫一個(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信息之后再注冊evnetbus,要用這種sticky=true注解方法來接受msg,因?yàn)閟ticky默認(rèn)為false的

  • @Subscribe(threadMode = ThreadMode.MAIN)

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

  • @Subscribe(threadMode = ThreadMode.BACKGROUND)

如果發(fā)布線程是主線程,eventbus就會(huì)用一個(gè)后臺子線程發(fā)送給主線程,如果發(fā)布線程是子線程,那么處理方法就在子線程執(zhí)行。最后經(jīng)過或者不經(jīng)過線程切換都會(huì)原來的線程。

  • @Subscribe(threadMode = ThreadMode.POSTING)

不需要切換線程,發(fā)布線程和處理線程一樣。簡單來說在什么線程post就在什么線程處理。

  • @Subscribe(threadMode = ThreadMode.ASYNC)

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

?

post和postSticky的區(qū)別

一般注冊后,再post信息要用post,而在沒注冊前post信息,這時(shí)候還沒有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)先級

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

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

}

取消訂閱者Subscriber

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

@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)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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

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