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);
}