錯誤信息:
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考過去,學個駕照,當然技術方面也是要提升。加油!!!
單曲循環《三角志》