我在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(