侦听器键集在 onMessageReceived 方法中与在类的其余部分中是不同的



我在onMessageReceived方法中使用侦听器,但数据映射中的键集与类中使用的键集不同(不同的对象地址(...您将在下面找到相关代码:

private String token;
@Singleton
private final Map<EventType, List<FCMListener>> listeners;
public enum EventType {
    //...
}
public PushApiConnection() {
    super();
    this.token = FirebaseInstanceId.getInstance().getToken();
    this.listeners = new HashMap<>();
}
public void onMessageReceived(RemoteMessage remoteMessage) {
    Map<String, String> data = remoteMessage.getData();
    if (data.size() > 0) {
        for(String key: data.keySet()){
            final String value = data.get(key);
            switch (key) {
                case "registrationEvent":
                    List<FCMListener> registrationListeners = this.listeners.get(EventType.registrationEventEntity);
                    if(registrationListeners!=null)
                        for (FCMListener listener : registrationListeners) listener.onReceiveMessage(value);
                    //here the keyset is empty
                    //this is called after the register method
                    Log.d(TAG, this.listeners.keySet().toString());
                    break;
                case "loginEvent":
                    List<FCMListener> loginListeners = this.listeners.get(EventType.loginEventEntity);
                    if(loginListeners!=null)
                        for (FCMListener listener : loginListeners) listener.onReceiveMessage(value);
                    //here the keyset is empty
                    //this is called after the register method
                    Log.d(TAG, this.listeners.keySet().toString());
                    break;
                case ...:
                    //some more cases
                default:
                    Log.d(TAG, key + " -> " + value);
                    throw new IllegalArgumentException("unknown key: "" + key + """);
            }
        }
    }
}
public void register(EventType eventType, FCMListener listener) {
    if (!this.listeners.containsKey(eventType))
        this.listeners.put(eventType, new ArrayList<>(1));
    List<FCMListener> listeners = this.listeners.get(eventType);
    listeners.add(listener);
    //here the keyset has two (different) events inside
    Log.d(TAG, "listeners "  + this.listeners.keyset().toString());
}

如果需要更多信息,我很乐意提供。

问题在于Firebase消息服务和应用创建了自己的onject实例。这就是为什么我们有两个不同的实例并且侦听器不起作用的原因。我希望这对遇到相同问题的人有所帮助。我试图使用意图修复它,但是调用构造函数时上下文为空,我目前正在寻找其他替代方案(将其存储到文件中可能是解决方案,尽管在我看来是肮脏的(。一旦我找到一种方法,我会回发。

您可以通过将listeners设置为静态变量来修复代码。

另外,我不明白您将如何使用此代码。
哪个代码在listeners HashMap 中注册侦听器?

如果您使用以下替代方法,可能会更容易:

  • 只需调用要调用的方法
  • 发送广播 https://developer.android.com/guide/components/broadcasts.html
  • (也许是本地广播 https://developer.android.com/reference/android/support/v4/content/LocalBroadcastManager.html(

相关内容

  • 没有找到相关文章

最新更新