【发布时间】:2011-07-09 04:42:45
【问题描述】:
我有点困惑。 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 中删除处理程序,而您仍在使用迭代器进行迭代。
这是一个棘手的问题吗?处理这种情况的安全方法是什么?
【问题讨论】:
标签: java android events iterator arraylist