2016-10-31 90 views
1

我嘗試首次使用Firebase的Eventbus。在Firebase服務中使用EventBus 3.0的異常 - Android

我得到下一個錯誤,因爲「訂閱者類java.lang.Class及其超類沒有使用@Subscribe註釋的公共方法」。

我在做什麼錯?

org.greenrobot.eventbus.EventBusException: Subscriber class java.lang.Class and its super classes have no public methods with the @Subscribe annotation 
         at org.greenrobot.eventbus.SubscriberMethodFinder.findSubscriberMethods(SubscriberMethodFinder.java:67) 
         at org.greenrobot.eventbus.EventBus.register(EventBus.java:136) 
         at net.techabout.medappointment.MyFirebaseMessagingService.onMessageReceived(MyFirebaseMessagingService.java:114) 
         at com.google.firebase.messaging.FirebaseMessagingService.zzo(Unknown Source) 
         at com.google.firebase.messaging.FirebaseMessagingService.zzn(Unknown Source) 
         at com.google.firebase.messaging.FirebaseMessagingService.zzm(Unknown Source) 
         at com.google.firebase.iid.zzb$2.run(Unknown Source) 
         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
         at java.lang.Thread.run(Thread.java:818) 

我FirebaseMessageService是:

import org.greenrobot.eventbus.EventBus; 
import org.greenrobot.eventbus.NoSubscriberEvent; 
import org.greenrobot.eventbus.Subscribe; 
import org.greenrobot.eventbus.ThreadMode; 
..... 
public class MyFirebaseMessagingService extends FirebaseMessagingService { 
    @Override 
    public void onMessageReceived(RemoteMessage remoteMessage) { 
     Log.d(TAG, "Mensagem recebida!"); 

    EventBus.getDefault().register(NoSubscriberEvent.class); 

    // Post the notification for an activity 
    EventBus.getDefault().post(remoteMessage); 
    } 

@Subscribe 
public void onMessageEvent(NoSubscriberEvent deadEvent) { 
     // We're all done here 
     EventBus.getDefault().unregister(this); 
} 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     EventBus.getDefault().register(this); 
    } 

    @Override 
    public void onDestroy() { 
     EventBus.getDefault().unregister(this); 
     super.onDestroy(); 
    } 

} 

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

回答

0

這是非常好的,您使用的方法常見的命名,它接收EventBus的事件。我的意思是後綴"Event"onMessageEvent
請嘗試添加下一個ProGuard規則:

############################# Basic EventBus stuff #################### 
# EventBus 3.0 
-keepclassmembers class ** { 
    public void onEvent*(**); 
} 

# EventBus 3.0 annotation 
-keepclassmembers class * { 
    @de.greenrobot.event.Subscribe <methods>; 
} 
-keep enum de.greenrobot.event.ThreadMode { *; } 

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

-dontskipnonpubliclibraryclassmembers 
############################# End ###################################### 

這:

-keep class com.path.to.your.events.** { *; } # modify package name !!!!!!!!!! 
-keepclassmembers class * { 
    *** *Event (...);       # every method which receives events, should have suffix 'Event' 
}