Android使用EventBus遇到的坑!

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類名來決定執行哪一個的;!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章