對正在迭代的清單進行修改時通常會遇到 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中文網其他相關文章!