1

我第一次尝试在 Firebase 中使用 Eventbus。

我收到下一个错误,因为“订阅者类 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();
    }

}

//保护规则

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

1 回答 1

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'
}
于 2016-11-03T09:53:23.877 回答