私はConcurrentModificationExeptionを単一のスレッドケースとみなして取得しました。また、リストを反復してループ内でそれを修正しようとすると、例外が発生することも知っています。したがって、実際にはイテレータを使用してイテレートして変更します。しかし、私はまだ例外があります。Android ArrayListのIteratorを使用してもConcurrentModificationExceptionが発生する
基本的には、アニメーションマネージャを実装しており、すべてのIAnimationオブジェクトをArrayListに格納しています。リストを変更するpublicメソッドはaddAnimationです。これはリストをループする別のメソッドで、calculateTickです。両方のメソッドが同期されているので、私はスレッドの問題があるとは思わない。そして先に述べたように、私はイテレータを使ってループを繰り返します。あなたは私にこの例外がある理由を知っていますか?ここで
は私のコードです:
private List<IAnimation> animations = new ArrayList<IAnimation>();
public synchronized void addAnimation(IAnimation animation) {
animations.add(animation);
mLooper.update();
inAnimation = true;
}
public synchronized void calculateTick(float tpf) {
for (Iterator<IAnimation> iterator = animations.iterator(); iterator.hasNext();) {
IAnimation animation= iterator.next();
boolean animateMore = animation.calculateTick(tpf);
if (!animateMore) {{
iterator.remove();
}
}
}
そして、ここでは私の例外です:
E/AndroidHarness(9546): Exception thrown in Thread[GLThread 1260,5,main]
4月17日11:55:38.001:E/AndroidHarness(9546):java.util.ConcurrentModificationExceptionが 04-17 11:55:38.001:E/AndroidHarness(9546):java.util.ArrayList $ ArrayListIterator.remove(ArrayList.java:582) 04-17 11:55:38.001:E/AndroidHarness(9546) :com.avaya.mco.gui.animation.AnimationManager.calculateTick(AnimationManager.java:50) 04-17 11:55:38.001:E/AndroidHarness(9546):com.avaya.mco.gui.jmonkey.android.MyApplication.simpleUpdate(MyApplication.java:60) 04-17 11:55:38.001: E/AndroidHarness(9546):at ......
今はリストのコピーを繰り返して、元のものから削除する必要があります。しかし、私はこの場合ArrayListIteratorが動作するはずだと思います。それがアンドロイドのバグかどうか分かりませんか? – trungdinhtrong
他の何かがリストを読んでいたり、変更したりしています。これは実装のバグよりはるかに可能です。 –
あなたは正しいです。そのループの中には、最終的にリストに変更が生じる場所があります。悲しいことに、私のコードはバグである可能性が高いと既に知っていましたが、他の人がもう一度それを助けていることを助けているのです。 – trungdinhtrong