【问题标题】:Exception using EventBus 3.0 in Firebase Service - Android在 Firebase 服务中使用 EventBus 3.0 的异常 - Android
【发布时间】:2016-10-31 01:40:33
【问题描述】:

我第一次尝试在 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-rules

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

【问题讨论】:

    标签: android service greenrobot-eventbus-3.0


    【解决方案1】:

    这很好,您使用通用命名方法,接收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'
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 2018-04-10
      • 1970-01-01
      • 2021-07-18
      相关资源
      最近更新 更多