如何在Android中处理ConcurrentModificationException

din*_*707 7 java android exception-handling arraylist

我试图从ArrayList中删除项目.有时它会弹出一个异常,"java.util.ConcurrentModificationException".

首先我尝试通过array_list_name.remove(i)删除它们,但它失败了,有些人被要求使用Iterator.所以我目前的代码如下.

for (Iterator<Collectable> iter = array_list_name.iterator(); iter.hasNext();) {
   Collectable s = iter.next();
   if (s.equals(array_list_name.get(id))){
       iter.remove();
       return true;
   }
}
Run Code Online (Sandbox Code Playgroud)

我在视图中的onDraw()函数中调用"array_list_name".我的观点是SurfaceView.任何人都可以建议我如何从ArrayList中删除项目而不会收到此错误.

Mur*_*PAY 7

尝试使用java.util.concurrent.CopyOnWriteArrayList而不是ArrayList


Bja*_*sen 6

从注释中可以看出,您ArrayList<Collectable>可以onDraw()通过UI 从一个线程中的方法访问,同时在另一个线程中从中删除项目.

那么,为什么不将两个访问器包装在一个

synchronized(array_list_name)
{
    // UI access code or item removal code
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果删除项目需要很长时间,这可能会使您的UI滞后.如果是这种情况,请考虑列出要删除的所有项索引,并在迭代整个列表后在紧密同步循环中删除它们.

更新

在我看来,您的整个代码段可以简化为:

synchronized(array_list_name)
    return array_list_name.remove(id);
Run Code Online (Sandbox Code Playgroud)