我正在尝试使用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();
}
}
// 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 :(得分: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'
}