当前位置: 代码迷 >> 综合 >> EventBus its super classes have no public methods with the @Subscribe annotation怎么解决?
  详细解决方案

EventBus its super classes have no public methods with the @Subscribe annotation怎么解决?

热度:81   发布时间:2024-01-03 12:51:19.0

引用文章:
文章1: link
文章2: link

可能原因1:

使用下面这个获取eventBus单例并在activity里注册后,忘记将方法注解Subscribe (添加@Subscribe,看下列示例)

EventBus.getDefault().register(this); 
    @Subscribe(threadMode = ThreadMode.MAIN)public void onMessageEvent(ITutorEventBus bus)  {
    }

可能原因2:

在build.gradle里添加了一些配置导致的,启了R8压缩 minifyEnabled true

   buildTypes {
    debug {
    minifyEnabled true  }}

那为什么开启了R8压缩就会导致上面的异常呢,是因为EventBus的注解使用了反射。

反射 (Reflection) 会导致 R8 在跟踪代码时无法识别到代码的入口点。第三方库也可能用到反射,并且由于第三方库实际上是您的应用的一部分,您 (作为应用开发者) 将负责这些库以及您自己的代码中使用的反射。第三方库可能附带了它们自己的规则,但是切记,有些库不一定是为 Android 编写的,抑或是未考虑缩减问题,因此它们可能需要其他配置。

原因2的解决方案:

1.关闭压缩,设为false即可, minifyEnabled false.
2.将eventBus添加至混淆

-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);
}
  相关解决方案