从监听器列表中删除监听器
Remove a Listener from a List of Listeners
我有一个函数可以将 自定义侦听器 添加到同一触发事件。
所以同一个事件可以触发多个侦听器,这是可行的。
我想要的是:如果我有 3 个听众(例如)能够只删除其中一个然后让其他两个工作。
这是我添加事件的函数,它们在 Map<String, CustomListener>
变量中。
void addEventListener(String eventName, EventListener eventListener) {
List<eventListener> eventListenerList = new ArrayList<>();
if (eventListenerMap.containsKey(eventName)) {
eventListenerList = eventListenerMap.get(eventName);
}
Objects.requireNonNull(eventListenerList).add(eventListener);
eventListenerMap.put(eventName, eventListenerList);
}
这是我删除的功能
void removeEventListener(String eventName, EventListener eventListener) {
if (eventListenerMap.containsKey(eventName)) {
List<InsEventListener> eventListenerList = eventListenerMap.get(eventName);
assert eventListenerList != null;
eventListenerList.remove(eventListener);
eventListenerMap.put(eventName, eventListenerList);
}
else {
Log.w("Remove Event Listener:", "Event not found");
}
}
正如您在下图中看到的,它识别具有相同 lamba 地址的相同 class,但它不会删除。
Obs:所有监听器在同一个地方同一个函数中被调用
那是因为 eventListenerList.remove(eventListener.getClass());
没有删除任何东西。您不应该通过他们的 class 来删除您的听众,而是通过索引或通过一种将他们彼此区分开来的方法。
如果您检查 remove()
return 值,您将得到 false,这意味着该参数不在该列表中。 oracle documentation.
In general an object can be removed in two ways from an ArrayList
(or generally any List), by index (remove(int)) and by object (remove(Object)). reference here
您需要做的事情:
为您的 EventListener
class 添加一个 equals(Object) 方法。这将使您能够 eventListenerList.remove(eventListener)
识别正确的对象。
我认为最简单的做法是向您的 Parent class 添加一个 name 或 id 属性,这在您的所有侦听器之间都是唯一的,并覆盖检查这些属性的 equals。
您可以使用 Android Studio IDE 轻松生成 equals(object)
方法,按 Ctrl + O 并选择等式方法。
编辑:
我建议为您的听众处理 ID 的两个选项:
- 在
addEventListener
中自己生成ID并return发送给调用者,
将侦听器存储在地图而不是列表中,关键是 ID。当有人
想要删除一个监听器,他会发送生成的 ID,你将删除
它来自事件的听众地图。
- 在
addEventListener
中自己生成 ID,并将其保存在 EventListener
ID 属性中,其他任何人都无法更改。然后,要删除特定的侦听器,您只需要实现一个检查 ID 属性的 equals
方法。
我有一个函数可以将 自定义侦听器 添加到同一触发事件。
所以同一个事件可以触发多个侦听器,这是可行的。 我想要的是:如果我有 3 个听众(例如)能够只删除其中一个然后让其他两个工作。
这是我添加事件的函数,它们在 Map<String, CustomListener>
变量中。
void addEventListener(String eventName, EventListener eventListener) {
List<eventListener> eventListenerList = new ArrayList<>();
if (eventListenerMap.containsKey(eventName)) {
eventListenerList = eventListenerMap.get(eventName);
}
Objects.requireNonNull(eventListenerList).add(eventListener);
eventListenerMap.put(eventName, eventListenerList);
}
这是我删除的功能
void removeEventListener(String eventName, EventListener eventListener) {
if (eventListenerMap.containsKey(eventName)) {
List<InsEventListener> eventListenerList = eventListenerMap.get(eventName);
assert eventListenerList != null;
eventListenerList.remove(eventListener);
eventListenerMap.put(eventName, eventListenerList);
}
else {
Log.w("Remove Event Listener:", "Event not found");
}
}
正如您在下图中看到的,它识别具有相同 lamba 地址的相同 class,但它不会删除。
Obs:所有监听器在同一个地方同一个函数中被调用
那是因为 eventListenerList.remove(eventListener.getClass());
没有删除任何东西。您不应该通过他们的 class 来删除您的听众,而是通过索引或通过一种将他们彼此区分开来的方法。
如果您检查 remove()
return 值,您将得到 false,这意味着该参数不在该列表中。 oracle documentation.
In general an object can be removed in two ways from an
ArrayList
(or generally any List), by index (remove(int)) and by object (remove(Object)). reference here
您需要做的事情:
为您的 EventListener
class 添加一个 equals(Object) 方法。这将使您能够 eventListenerList.remove(eventListener)
识别正确的对象。
我认为最简单的做法是向您的 Parent class 添加一个 name 或 id 属性,这在您的所有侦听器之间都是唯一的,并覆盖检查这些属性的 equals。
您可以使用 Android Studio IDE 轻松生成 equals(object)
方法,按 Ctrl + O 并选择等式方法。
编辑:
我建议为您的听众处理 ID 的两个选项:
- 在
addEventListener
中自己生成ID并return发送给调用者, 将侦听器存储在地图而不是列表中,关键是 ID。当有人 想要删除一个监听器,他会发送生成的 ID,你将删除 它来自事件的听众地图。 - 在
addEventListener
中自己生成 ID,并将其保存在EventListener
ID 属性中,其他任何人都无法更改。然后,要删除特定的侦听器,您只需要实现一个检查 ID 属性的equals
方法。