EventBus是一款針對Android優化的發佈/訂閱事件總線(內部是觀察者設計模式)。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,線程之間傳遞消息.優點是開銷小,代碼更優雅。以及將發送者和接收者解耦。
來個清晰明瞭的圖片:
Event:事件(訂閱者根據事件來判斷是否接收事件)
Subscriber:事件訂閱者,接收特定的事件。
Publisher:事件發佈者,用於通知Subscriber有事件發生。
其中,Event可以使任意類型對象。Subscriber都是以約定的onEvent開頭的函數,具體是onEvent,onEventMainThread,onEventBackgroundThread,onEventAsync這四個。Publisher可以通過post(Object)在任意線程任意位置發送事件。
混淆文件配置
-keepattributes *Annotation*//keep反射
-keepclassmembers class * {
@org.greenrobot.eventbus.Subscribe <methods>;//這個牽涉到你的需求如何,如果你使用了EventBus processor進行加速,你就必須加上這個,只要有這個註解的類和方法都不混淆,爲反編譯提供了便利。。。如果沒有用到加速,這個就不用了
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
# Only required if you use AsyncExecutor//如果你使用了ASYNC 異步線程
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
<init>(java.lang.Throwable);
}
-keep class de.greenrobot.event.** {*;}
-keepclassmembers class ** {
public void onEvent*(**);
void onEvent*(**);
}
-keepclassmembers class * {@com.xxx.Subscribe ;}
-keepclassmembers class * {@com.xxx.Action ;}
經常會出現的問題
1、若使用EventBus時出現異常:Subscriber class *** and its super classes have no public methods with the @Subscribe annotation
報錯的原因:使用EventBus的方法不是public,且缺少@Subscribe這個註解。
按照提示改爲public,並且加上@Subscribe這個註解就Ok了。
2、若收不到事件,比如在Activity的oncreat中發送事件,在Fragment中的oncreat中接收事件,可能是因爲發送事件時Fragment還未註冊EventBus。
3、發送事件的類是不需要註冊的,只有接收事件的類需要註冊;注意要記得在合適時機取消註冊。
EventBus升級3.0以後事件的訂閱已經從方法名換成了註解的方式,而且整體還是有不少變化。但使用原理之類的沒有變
EventBus包含4個ThreadMode:PostThread,MainThread,BackgroundThread,Async
方法名爲:onEventPostThread, onEventMainThread,onEventBackgroundThread,onEventAsync即可
onEventMainThread代表這個方法會在UI線程執行
onEventPostThread代表這個方法會在當前發佈事件的線程執行
BackgroundThread這個方法,如果在非UI線程發佈的事件,則直接執行,和發佈在同一個線程中。如果在UI線程發佈的事件,則加入後臺任務隊列,使用線程池一個接一個調用
Async 加入後臺任務隊列,使用線程池調用,注意沒有BackgroundThread中的一個接一個
EventBus在一個頁面中註冊EventBus.getDefault().register(this);,
在onDestory()中取消註冊 EventBus.getDefault().unregister(this);
在其他頁面post(同一個頁面也可以),EventBus.getDefault().post(object)),object是自定義的對象。;
在註冊頁面中重寫onEvent**(object)接收消息。
EventBus內部是通過觀察者模式實現告知觀察者事件發生時通過EventBus.post函數實現,這個過程叫做事件的發佈,觀察者被告知事件發生叫做事件的接收,是通過下面的訂閱函數實現的。
消息的接收是根據參數中的哦object類名來決定執行哪一個的;!!!