我对一件事感到有些困惑。Java的文档告诉我们,在使用Iterator对象迭代集合时,从集合中删除项目没有定义的行为,并且唯一安全的方法是使用Iterator.remove()。那么,如果在遍历列表时,其中一个事件处理程序决定将自己作为侦听器移除,您如何安全地从ArrayList中删除该事件处理程序?
// in public class Dispatcher
public void dispatchEvent(){
Iterator<IEventHandler> iterator = mHandlers.iterator();
IEventHandler handler = null;
while(iterator.hasNext()){
handler = iterator.next();
handler.onCallbackEvent();
}
}
public void insertHandler(IEventHandler h){
mHandlers.add(h);
}
public void removeHandler(IEventHandler h){
mHandlers.remove(h);
}
同时,处理程序是这样实例化的...
final Dispatcher d = new Dispatcher();
d.insertHandler(new IEventHandler(){
@Override
public void onCallbackEvent(){
Log.i(" callback happened ");
d.removeHandler(this);
}
});
看到潜在问题了吗?在使用迭代器进行迭代时,由于在特定处理程序中声明的onCallbackEvent(),你正在从ArrayList中删除处理程序。 这是一个无法解决的问题吗? 如何安全地处理这种情况?