有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在Android中处理ConcurrentModificationException

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

首先,我试图通过array_list_name.remove(i)删除它们,但失败了,一些人被要求使用迭代器。所以我现在的代码如下:

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;
   }
}

我在视图中调用array_list_nameonDraw()函数。我的观点是SurfaceView。有谁能建议我如何从ArrayList中删除项目而不出现此错误吗


共 (2) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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

    那么,为什么不把两个访问器都打包成一个

    synchronized(array_list_name)
    {
        // UI access code or item removal code
    }
    

    请注意,如果删除项目需要很长时间,这可能会导致UI滞后。如果是这种情况,请考虑将要删除的所有项索引列表,并在遍历整个列表之后以紧密同步的循环将它们移除。

    更新

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

    synchronized(array_list_name)
        return array_list_name.remove(id);