5

我在库中有一个带注释的 Activity,它是来自同一库的 EventBus 事件的订阅者。它看起来像这样,大大简化:

@EActivity(resName = "activity_foo")
public class Foo extends Activity {

    public void onEvent(BarEvent event){
        doSomething();
    }
}

它应该按照以下方式工作:

http://timnew.me/blog/2014/09/14/otto-and-android-annotations-compatibility-issue-analysis/

但实际上它返回此错误:

无法启动活动... de.greenrobot.event.EventBusException:订阅者类 com.foo.bar.activities.Foo_ 没有称为 onEvent 的公共方法

似乎 EventBus 不在父类中。我猜每个人都在谈论的@Subscribe 注释只在 Guava 和 Otto 中,而不是在 EventBus 中。没有人在网上谈论 AA 和 Eventbus 之间的兼容性问题,所以我一定遗漏了一些东西。

我怎样才能使这项工作?

事件总线:2.4

机管局:3.2

编辑

在 WonderCsabo 的回答之后,我将 EventBus 更新为 3.0 beta(包括订阅注释),将 AA 更新为 3.3.1,问题就消失了,但还有另一个问题:

   java.lang.NoSuchFieldError
            at libcore.reflect.AnnotationAccess.decodeValue(AnnotationAccess.java:688)
            at libcore.reflect.AnnotationAccess.getDefaultValue(AnnotationAccess.java:361)
            at java.lang.reflect.Method.getDefaultValue(Method.java:327)
            at libcore.reflect.AnnotationFactory.getElementsDescription(AnnotationFactory.java:75)
            at libcore.reflect.AnnotationFactory.<init>(AnnotationFactory.java:112)
            at libcore.reflect.AnnotationFactory.createAnnotation(AnnotationFactory.java:94)
            at libcore.reflect.AnnotationAccess.toAnnotationInstance(AnnotationAccess.java:666)
            at libcore.reflect.AnnotationAccess.toAnnotationInstance(AnnotationAccess.java:641)
            at libcore.reflect.AnnotationAccess.getDeclaredAnnotation(AnnotationAccess.java:170)
            at java.lang.reflect.Method.getAnnotation(Method.java:301)
            at de.greenrobot.event.n.b(SourceFile:133)
            at de.greenrobot.event.n.a(SourceFile:79)
            at de.greenrobot.event.c.a(SourceFile:135)
            at com.babestudios.lib.lq.activities.f.onStart(SourceFile:515)
            at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1236)
            at android.app.Activity.performStart(Activity.java:6006)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2288)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
            at android.app.ActivityThread.access$800(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5254)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
     Caused by: java.lang.NoSuchFieldException: PostThread
            at java.lang.Class.getDeclaredField(Class.java:890)
            at libcore.reflect.AnnotationAccess.decodeValue(AnnotationAccess.java:685)
            at libcore.reflect.AnnotationAccess.getDefaultValue(AnnotationAccess.java:361)
            at java.lang.reflect.Method.getDefaultValue(Method.java:327)
            at libcore.reflect.AnnotationFactory.getElementsDescription(AnnotationFactory.java:75)
            at libcore.reflect.AnnotationFactory.<init>(AnnotationFactory.java:112)
            at libcore.reflect.AnnotationFactory.createAnnotation(AnnotationFactory.java:94)
            at libcore.reflect.AnnotationAccess.toAnnotationInstance(AnnotationAccess.java:666)
            at libcore.reflect.AnnotationAccess.toAnnotationInstance(AnnotationAccess.java:641)
            at libcore.reflect.AnnotationAccess.getDeclaredAnnotation(AnnotationAccess.java:170)
            at java.lang.reflect.Method.getAnnotation(Method.java:301)
            at de.greenrobot.event.n.b(SourceFile:133)
            at de.greenrobot.event.n.a(SourceFile:79)
            at de.greenrobot.event.c.a(SourceFile:135)
            at com.babestudios.lib.lq.activities.f.onStart(SourceFile:515)
            at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1236)
            at android.app.Activity.performStart(Activity.java:6006)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2288)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
            at android.app.ActivityThread.access$800(ActivityThread.java:151)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5254)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

而且我注意到这两个问题(缺少 onEvent 和现在 PostThread 只是发布版本上的一个问题。我使用 ProGuard 以及 EventBus 和 AA 的推荐例外)。

编辑 2

我添加了

-keep class de.greenrobot.** {*;}

它似乎正在工作。

4

4 回答 4

5

我有 EventBus Annotations 与:

# Ensure annotations are kept for runtime use.
-keepattributes *Annotation*
# Don't remove any GreenRobot classes
-keep class de.greenrobot.** {*;}
# Don't remove any methods that have the @Subscribe annotation
-keepclassmembers class ** {
    @de.greenrobot.event.Subscribe <methods>;
}

请注意,这还可以确保您的方法名称仍然被混淆。

于 2015-07-22T15:26:04.130 回答
4

如果有人仍然面临这个错误,使用 EventBus 3.0 包被重命名(org而不是de,而eventbus不是event),所以正确的 proguard 配置是:

## GreenRobot EventBus specific rules ##
# http://greenrobot.org/eventbus/documentation/proguard/

-keepattributes *Annotation*

-keepclassmembers class ** {
    @org.greenrobot.eventbus.Subscribe <methods>;
}

-keep enum org.greenrobot.eventbus.ThreadMode { *; }

# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
    <init>(java.lang.Throwable);
}

如他们网站中所述

于 2016-02-19T08:14:57.210 回答
2

你有三个选择:

  • 使用奥托。它也有与 EventBus 相同的问题,但是 AndroidAnnotations 具有解决该问题的特定Otto 集成。
  • 如果你想坚持使用 EventBus,你可以试试实验版本,它没有 2.4.0 的问题。它也更好,因为它基于注释而不是方法命名,更不用说可选的 EventBus 注释处理器带来的巨大性能提升。但它仍处于测试阶段。
  • 或者,您可以使用 EventBus 2.3.0,它没有 2.4.0 的问题。

顺便说一句,您应该更新到最新的 AndroidAnnotations,3.3.1。

于 2015-06-22T22:43:34.977 回答
0

更新

看来这不是正确的答案。无论如何都会抛出异常。

原始答案

从 EventBus 3 开始,您可以通过调用来禁用订阅者异常throwSubscriberException(false)

通过在您的应用程序类中调用它,您可以为您的默认事件总线禁用此异常。

EventBus.builder().throwSubscriberException(false).installDefaultEventBus();
于 2016-03-01T00:22:42.130 回答