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 ;
}
-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考过去,学个驾照,当然技术方面也是要提升。加油!!!

单曲循环《三角志》

你可能感兴趣的:(Android EventBus Subscriber class XXXActivity has no public methods called onEvent)