错误信息:
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 ;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
# And if you use AsyncExecutor:
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
(java.lang.Throwable);
}
至此问题解决。以后遇到debug包正常,Release包却崩溃或者不正常的问题,大多都是混淆的原因。
每日语录:新的一年,新的开始,一切都有可能,所以给自己定个小目标吧,不管能不能实现,首先先把Flag立起来。
我希望新的一年,可以多存钱,可以把日语的N2考过去,学个驾照,当然技术方面也是要提升。加油!!!
单曲循环《三角志》