gpt4 book ai didi

java - 如何避免监听一次监听器的 ConcurrentModificationException 异常

转载 作者:行者123 更新时间:2023-12-01 21:33:56 25 4
gpt4 key购买 nike

有一个mEventMap来保存不同事件的监听器,并有addListener()来注册事件监听器,removeListener()和dispatchEvent()到注册的监听器。

public void addListener(EventListener listener) {
synchronized (mEventMap) {

List<WeakReference<EventListener<Event>>> listeners = mEventMap.get(listener.mEventClass);
WeakReference<EventListener<Event>> listenerRef = new WeakReference<>(
(EventListener<Event>) listener)

listeners.add(listenerRef);


}

}

public void removeListener(EventListener listener) {
synchronized (mEventMap) {
List<WeakReference<EventListener<Event>>> listeners = mEventMap.get(listener.mEventClass);


if (contains(listeners, listener)) {
doRemove(listeners, listener);
}


}
}


public boolean dispatchEvent(Event event) {
synchronized (mEventMap) {
List<WeakReference<EventListener<Event>>> listeners = mEventMap.get(event.getClass());
ListIterator<WeakReference<EventListener<Event>>> listenerIterator = listeners.listIterator(listeners.size());

while (listenerIterator.hasPrevious()) {
WeakReference<EventListener<Event>> listenerItem = listenerIterator.previous();
EventListener<Event> listenerRef = listenerItem.get();
if (listenerRef != null) {
listenerRef.onEvent(event);
} else {
listenerIterator.remove();
}
}


}

用例

EventListener<Event> mEventListener = new EventListener<Event>(
Event.class) {
@Override
public boolean onEvent(Event event) {
eMgr.removeListener(mEventListener);
// do something
}
};

addEventListener(mEventListener);

在dispatchEvent()中,当它在循环中时,removeListener()被调用并在listenerItem =listenerIterator.previous();处引发ConcurrentModificationException;

问题:当有人迭代 mEventMap 数据时,避免因 mEventMap 数据更改而导致崩溃的最佳方法是什么。

最佳答案

您的问题是您想要从列表中删除一个元素同时使用隐式迭代器遍历它。

您可以通过显式使用迭代器来解决这个问题:

for (Iterator<EventListener> it = list.iterator(); it.hasNext(); ) {
EventListener el = it.next();
it.remove();
}

关于java - 如何避免监听一次监听器的 ConcurrentModificationException 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37138390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com