2

シングルスレッドのケースと思われるもので 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): ... ...

4

1 に答える 1

0

ここでリストを反復処理する他の関数が欠落していないと確信していますか? 多分アニメーションを再生する何か?

また、それが役に立たない場合は、「ConcurrentLinkedQueue」を使用してみてください: http://developer.android.com/reference/java/util/concurrent/ConcurrentLinkedQueue.html すべてのバージョンで利用でき、イテレータについては次のように表示されます: 「...返されたイテレータは、ConcurrentModificationException を決してスローしない「弱い一貫性のある」イテレータであり、イテレータの構築時に存在していた要素をトラバースすることを保証し、構築後の変更を反映する可能性があります (ただし、保証されていません)。 "

于 2012-04-21T22:14:01.057 に答える