OnTouchEvent メソッド内で ArrayList (mElements) を変更するときに、アプリケーションで ConcurrentModificationException が発生します。このコードは、Iterator を使用して mElement を反復処理し、特定のタッチ イベントが発生すると、新しい要素をリストに追加しようとします。これは、synchronized(mElements) ブロック内で発生します。
java.util.ConcurrentModificationException
ConcurrentModificationException は、ArrayList が (要素の追加によって) 変更されている間に発生します。イテレータを使用してトラバースされます。反復子は、基礎となるコレクションが反復中に変更されないままであることを期待します。ただし、反復中にリストに要素を追加することは、この期待に違反します。
例外を解決するには、反復の完了後に新しい要素をリストに追加する必要があります。これは、追加のリストを使用して新しい要素を保持し、反復後にそれらをメインの mElements リストに追加することで実現できます。
List<Element> thingsToBeAdd = new ArrayList<Element>(); for (Iterator<Element> it = mElements.iterator(); it.hasNext(); ) { Element element = it.next(); // ... if (element.cFlag) { thingsToBeAdd.add(new Element("crack", getResources(), (int) touchX, (int) touchY)); element.cFlag = false; } } mElements.addAll(thingsToBeAdd);
上記の解決策の代替として場合は、拡張された for-each ループ構文の使用を検討してください。これにより、反復子の必要性が回避され、同期が内部で処理されます。
for (Element element : mElements) { // ... if (element.cFlag) { thingsToBeAdd.add(new Element("crack", getResources(), (int) touchX, (int) touchY)); element.cFlag = false; } } mElements.addAll(thingsToBeAdd);
以上が反復中に ArrayList に追加するときに ConcurrentModificationException を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。