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