当前位置: 首页 > 知识库问答 >
问题:

Android注释和事件总线

呼延子安
2023-03-14

我在一个库中有一个带注释的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 . green robot . event . event bus exception:订户类com.foo.bar.activities.Foo_没有名为onEvent的公共方法

事件总线似乎不在父类中查找。我想每个人都在谈论@Subscribe注释仅在番石榴和奥托中,而不是在EventBus中。没有人在谈论网络上的AA和Eventbus之间的兼容性问题,所以我一定错过了一些东西。

我怎样才能让它发挥作用?

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)

我注意到这两个问题(在Event上丢失,现在后线程只是发布版本上的一个问题。我使用 ProGuard,但建议的例外情况是事件总线和 AA)。

编辑2:

添加

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

它似乎正在起作用。

共有3个答案

阎宾实
2023-03-14

您有三种选择:

    < li >使用奥托。它也有和EventBus一样的问题,但是AndroidAnnotations有专门的Otto集成解决了这个问题。 < li >如果您想继续使用EventBus,您可以试用实验版,它没有2.4.0中的问题。它也更好,因为它基于注释而不是方法命名,更不用说可选的EventBus注释处理器带来的巨大性能提升。但它仍处于测试阶段。 < li >或者您可以使用EventBus 2.3.0,它没有您在2.4.0中遇到的问题。

顺便说一下,你应该更新到最新的AndroidAnnotations 3.3.1。

支淮晨
2023-03-14

如果有人仍然遇到此错误,使用 EventBus 3.0,软件包被重命名(组织而不是 de事件总线而不是事件),因此正确的 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);
}

正如他们的网站所记载的那样

上官霄
2023-03-14

我使用EventBus注释:

# 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>;
}

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

 类似资料:
  • 问题内容: 之间有什么区别? 在整个类中添加“ @Transactional”注释 为每个方法添加“ @Transactional”注释? 使用spring和Hibernate吗? 问题答案: 基本上,如果您用所有方法注释该类,则将是事务性的。如果您不这样做,则可以仅将其标注为所需的方法。此外,你可以为每个方法指定不同的属性,如,,,…

  • 问题内容: 我有一个枚举: 我想在Android注释的indDef中使用它: 错误显示: 找到不兼容的类型,必需:“ long” 这种不兼容该怎么办? 我不想手动处理AppEnum参数的值,Enum通常会自动创建值。返回enum参数的int值,但在这里不起作用。 问题答案: 注释的主要思想是使用常量集,例如an ,但 不使用 。在这种情况下,您必须手动声明所有常量。 您可以在此处查看详细的示例。

  • 和和注释之间有什么区别? 我们应该在什么时候使用它们每一个?

  • 让我们跳进 API 获取事件总线 你获取到事件总线的引用,如下所示: EventBus eb = vertx.eventBus(); 还有每个 Vert.x 实例事件总线的单个实例。 注册处理程序 这个最简单的方法来注册一个处理程序用consumer。下面是一个示例: EventBus eb = vertx.eventBus(); eb.consumer("news.uk.sport", mess

  • 问题内容: 我想使用Spring和.jspx网页创建一个Web应用程序。 我的问题是如何在jspx中放置IE的条件注释?他们似乎没有被解释。 另外,我希望我的网页符合HTML5。 我尝试了一些方法,但是在IE9中出现了不兼容问题(似乎无法识别标题和部分)。 编辑: 这是我的头牌 但是,如果我查看IE9下的源代码,则看不到html5shiv和我的辅助CSS的链接。 问题答案: 根据JSP 2.0规范

  • 注:本节未经校验,如有问题欢迎提issue 最初设想是为了提供一种向多个actor群发消息的方法,之后EventBus被一般化为一组实现一个简单接口的可组合的特质: /** * Attempts to register the subscriber to the specified Classifier * @return true if successful and false if not