Android EventBus Subscriber class XXXActivity has no public methods called onEvent

錯誤信息:

Caused by: c.a.a.g: Subscriber class XXXActivity has no public methods called onEvent.

造成這個錯誤的原因有兩個:

A:接受Event的頁面,寫了EventBus.getDefualt().register(this),但是在這個頁面裏卻沒有定義一個以 onEvent開頭的、非靜態的、public權限以及僅僅只有一個參數 的方法,也就是沒有類似於:public void onEvent**(Object arg)這樣的方法。

解決辦法很簡單,查看下該頁面是否有必要onEvent**(Object arg)方法即可。PS:只有在需要接收EventBus消息的頁面,你纔去註冊EventBus.getDefault().register(this),並且複寫一個onEvent開頭的公共的方法,如果你僅僅是單純的發送消息EventBus.getDefault().post(bean); 是不需要註冊的。

B: 如果檢查發現確實寫了onEvent**(Object arg)方法,但是還是報錯,或者是debug包的時候是正常的,Release包卻崩潰了,那原因就是混淆的原因

解決辦法:在你的混淆文件忽略混淆onEvent的相關即可,不同的版本的混淆方式可能有點差別,根據你的eventBus版本去查對應的混淆方法。(EventBus github地址

舉例:EventBus 2.4 的混淆方法:

-keep class de.greenrobot.event.** {*;}
-keepclassmembers class ** {
    public void onEvent*(**);
    void onEvent*(**);
}

EventBus 3.0 的混淆方法:

-keepattributes *Annotation*
-keepclassmembers class * {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
 
# And if you use AsyncExecutor:
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
    <init>(java.lang.Throwable);
}

至此問題解決。以後遇到debug包正常,Release包卻崩潰或者不正常的問題,大多都是混淆的原因。

每日語錄:新的一年,新的開始,一切都有可能,所以給自己定個小目標吧,不管能不能實現,首先先把Flag立起來。

我希望新的一年,可以多存錢,可以把日語的N2考過去,學個駕照,當然技術方面也是要提升。加油!!!

單曲循環《三角志》

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