ConcurrentModificationException甚至在android ArrayList中使用Iterator

时间:2012-04-17 16:26:24

标签: android arraylist

我在一个单线程案例中得到了一个ConcurrentModificationExeption。我也知道如果你遍历一个List并尝试在循环中修改它,你会有一个例外。因此,我实际上使用迭代器进行迭代和修改。但是,我仍有例外。

基本上,我正在实现一些动画管理器,并将所有IAnimation对象存储在ArrayList中。有一个公共方法可以更改列表,即addAnimation。这是循环遍历列表的另一种方法,即calculateTick。由于两种方法都是同步的,我不认为我有一个线程问题。并且如前所述,我使用迭代器迭代thruogh循环。你们有什么想法我有这个例外吗?

这是我的代码:

    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):at java.util.ArrayList $ ArrayListIterator.remove(ArrayList.java:582) 04-17 11:55:38.001:E / AndroidHarness(9546):at com.avaya.mco.gui.animation.AnimationManager.calculateTick(AnimationManager.java:50) 04-17 11:55:38.001:E / AndroidHarness(9546):at com.avaya.mco.gui.jmonkey.android.MyApplication.simpleUpdate(MyApplication.java:60) 04-17 11:55:38.001:E / AndroidHarness(9546):at ......

1 个答案:

答案 0 :(得分:0)

你确定这里没有其他功能可以迭代列表吗?也许是播放动画的东西?

另外,如果这没有帮助,请尝试使用“ConcurrentLinkedQueue”: http://developer.android.com/reference/java/util/concurrent/ConcurrentLinkedQueue.html 它适用于所有版本,它表示对于迭代器: “...返回的迭代器是一个”弱一致“的迭代器,它永远不会抛出ConcurrentModificationException,并保证遍历构造迭代器时存在的元素,并且可能(但不保证)反映构造之后的任何修改。 “