3

「blob」オブジェクトの ArrayList があるとします。これを循環してキャンバスに描画します。

     for (blob b:myBlobList)
     {
         canvas.drawCircle(b.X, b.Y, b.Size, paint);
     }

また、表面に触れるたびに新しいブロブ オブジェクトを追加する onTouchListener があります。

      if (event.getAction() == android.view.MotionEvent.ACTION_DOWN)
        {
          myBlobList.add(new blob());
          myBlobList.get(myBlobList.size()-1).X = event.getX();
          myBlobList.get(myBlobList.size()-1).Y = event.getY();;
        }

しかし、一緒にすると ConcurrentModificationException エラーが発生します。あなたの提案は何ですか、どうすればそれを修正できますか?

追加するだけ

try{ ... } catch (ConcurrentModificationException e) {}

この例外が発生し、頻繁に発生すると、画面/キャンバスがちらつきます。:)

ありがとう!

4

4 に答える 4

3

CopyOnWriteArrayListあなたはあなたのブロブに使うことができます

于 2012-05-01T14:00:09.637 に答える
3

そのリストを繰り返し処理しているときに、新しいブロブをリストに追加しているようです。簡単な回避策の 1 つは、ループの前にリストのコピーを作成することです。反復中にアイテムを追加しても、それらは考慮されません。

List<Blob> myBlobCopy = new ArrayList<Blob>(myBlobList); //copies the content
for (Blob b : myBlobCopy) {
    canvas.drawCircle(b.X, b.Y, b.Size, paint);
}
于 2012-05-01T13:50:19.080 に答える
1

forEach ループの代わりに単純な for ループを使用して、独自のインデックス カウンターで反復処理を行うことができます。

for(int i = 0; i < myBlobList.size(); i++){
   blob b = myBlobList.get(i);
   canvas.drawCircle(b.X, b.Y, b.Size, paint);
}

このConcurrentModificationExceptionは、ArrayList を反復処理するときに forEach ループが Iterator を保持しているときに、他のスレッドから ArrayList の要素を追加または削除しているため発生しています。

于 2012-05-01T14:05:38.767 に答える
1

次に、onTouchListener で使用する 2 番目のリスト myBlobList2 が必要です。

for (blob b:myBlobList){
         canvas.drawCircle(b.X, b.Y, b.Size, paint);
     }

myBlobList.addAll(myBlobList2);
myBlobList2.clear();

次の場合、依然として同期の問題が発生する可能性があります。

  • myBlobList.addAll 中に myBlobList2 にオブジェクトを追加する
于 2012-05-01T13:53:23.010 に答える