对正在迭代的列表进行修改时通常会遇到 ConcurrentModificationException。此异常可能在多种情况下出现,其中之一是使用迭代器更改 ArrayList 时。
在提供的代码片段中,当向 mElements ArrayList 添加新元素时,在 OnTouchEvent 事件期间会出现此问题:
for (Iterator<Element> it = mElements.iterator(); it.hasNext();){ Element element = it.next(); // ... if(element.cFlag){ mElements.add(new Element("crack",getResources(), (int)touchX,(int)touchY)); element.cFlag = false; } }
抛出 ConcurrentModificationException 是因为列表在使用迭代时被修改(通过添加元素)迭代器。
为了解决这个问题,建议使用单独的 List 来存储迭代过程中需要添加的元素:
List<Element> thingsToBeAdded = new ArrayList<Element>(); for (Iterator<Element> it = mElements.iterator(); it.hasNext();) { Element element = it.next(); // ... if (element.cFlag) { // Instead of adding elements directly to mElements, add them to thingsToBeAdded thingsToBeAdded.add(new Element("crack", getResources(), (int) touchX, (int) touchY)); element.cFlag = false; } } mElements.addAll(thingsToBeAdded);
通过使用这种方法,修改为原始列表可以推迟到迭代元素之后,从而避免 ConcurrentModificationException。
以上是Android 迭代过程中添加 ArrayList 时如何避免 ConcurrentModificationException?的详细内容。更多信息请关注PHP中文网其他相关文章!