シングルスレッドのケースと思われるもので ConcurrentModificationExeption を取得しました。また、リストを反復処理してループ内で変更しようとすると、例外が発生することもわかっています。したがって、実際には反復子を使用して反復および変更します。ただし、まだ例外があります。
基本的に、いくつかのアニメーション マネージャーを実装しており、すべての IAnimation オブジェクトを ArrayList に格納しています。リストを変更する public メソッドが 1 つあります。それは 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]
04-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): ... ...