2015-06-22 13 views
5

Ho un'attività annotata in una libreria, che è un sottoscrittore di un evento EventBus dalla stessa libreria. Sembra qualcosa di simile, notevolmente semplificato:AndroidAnnotations ed EventBus

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

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

Si deve lavorare in base a questo:

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

Ma in realtà ritorna con questo errore:

Unable to start activity ... de.greenrobot.event.EventBusException: Subscriber class com.foo.bar.activities.Foo_ has no public methods called onEvent

Sembra EventBus non appare nella classe genitore. Immagino che l'annotazione @Subscribe di cui tutti parlano sia solo in Guava e Otto, ma non in EventBus. Nessuno sta parlando di problemi di compatibilità tra AA e Eventbus sulla rete, quindi mi manca qualcosa.

Come posso fare questo lavoro?

EventBus: 2.4

AA: 3.2

EDIT:

Dopo la risposta di WonderCsabo ho aggiornato EventBus a 3.0 beta (tra cui Iscriviti annotazioni) e AA a 3.3.1 e il problema è andato, ma ce n'è un altro:

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) 

E ho notato che entrambi i problemi (il mancante sfogo e ora il PostThread è solo un problema nella versione di rilascio. Io uso ProGuard con le eccezioni raccomandate per EventBus e AA).

EDIT 2:

ho aggiunto

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

e sembra funzionare.

+0

sembra che tu prenda una chiamata alla classe 'Foo_' invece della classe' Foo'. –

+1

Sì, questo è il punto in AA. È una sottoclasse generata di Foo. – Herrbert74

+0

grazie funziona –

risposta

2

Sono disponibili tre opzioni:

  • Usa Otto. Ha anche lo stesso problema che hai affrontato con EventBus, tuttavia AndroidAnnotations ha uno specifico Otto integration che risolve questo problema.
  • Se si desidera utilizzare EventBus, è possibile provare lo experimental version, che non presenta il problema come 2.4.0. È anche più bello in quanto si basa su annotazioni anziché sulla denominazione del metodo, senza parlare dell'enorme aumento delle prestazioni del processore di annotazione EventBus opzionale. Ma è ancora in beta.
  • Oppure puoi usare EventBus 2.3.0, che non ha il problema di quello che hai con 2.4.0.

A proposito, è necessario eseguire l'aggiornamento all'ultima AndroidAnnotations, 3.3.1.

5

devo EventBus Annotazioni lavorare con:

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

Si noti che questo assicura anche che i nomi dei metodi ancora vengono offuscati.

4

Nel caso in cui qualcuno deve ancora affrontare questo errore, con EventBus 3.0 il pacchetto è stato rinominato (org invece di de, e eventbus invece di event), quindi la configurazione Proguard corretta è:

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

come documentato nella loro site

0

UPDATE

sembra che questo non è il giusto answe r. L'eccezione è comunque lanciata.

risposta originale

partire dal EventBus 3 è possibile disabilitare l'eccezione di abbonati chiamando throwSubscriberException(false).

Chiamando questo nella classe dell'applicazione è possibile disabilitare questa eccezione per il bus di eventi predefinito.

EventBus.builder().throwSubscriberException(false).installDefaultEventBus(); 
Problemi correlati