Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ConcurrentModificationException即使在android ArrayList中使用迭代器_Android_Arraylist - Fatal编程技术网

ConcurrentModificationException即使在android ArrayList中使用迭代器

ConcurrentModificationException即使在android ArrayList中使用迭代器,android,arraylist,Android,Arraylist,在我认为是单线程的情况下,我得到了一个ConcurrentModificationExection选项。我还知道,如果您遍历一个列表并尝试在循环中修改它,您将遇到一个异常。因此,我实际上使用迭代器对其进行迭代和修改。不过,我还是有例外 基本上,我正在实现一些动画管理器,并将所有IAnimation对象存储在ArrayList中。有一个公共方法可以更改列表,即addAnimation。还有另一种方法在列表中循环,这就是calculateTick。由于这两种方法都是同步的,我认为我没有线程问题。如前

在我认为是单线程的情况下,我得到了一个ConcurrentModificationExection选项。我还知道,如果您遍历一个列表并尝试在循环中修改它,您将遇到一个异常。因此,我实际上使用迭代器对其进行迭代和修改。不过,我还是有例外

基本上,我正在实现一些动画管理器,并将所有IAnimation对象存储在ArrayList中。有一个公共方法可以更改列表,即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();
        }
    }

}
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.Calculatick(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):在……

处,您确定此处没有其他函数缺失,可以迭代列表吗?也许是播放动画的东西

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

您确定没有其他函数在列表中迭代吗?也许是播放动画的东西

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

现在我必须遍历列表的副本,然后从原始列表中删除。但我认为Arraylisterator应该在这种情况下起作用。不知道这是不是安卓的bug?还有其他的东西正在读取或修改列表——在你的代码中搜索其他可能会这样做的东西。这远比实现中的bug更可能。你是对的。在这个循环中,有一个地方最终会导致列表中可能的更改。遗憾的是,我已经知道我的代码很可能有缺陷,但让别人再说一遍仍然有帮助。现在我必须遍历列表的副本,然后从原始列表中删除。但我认为Arraylisterator应该在这种情况下起作用。不知道这是不是安卓的bug?还有其他的东西正在读取或修改列表——在你的代码中搜索其他可能会这样做的东西。这远比实现中的bug更可能。你是对的。在这个循环中,有一个地方最终会导致列表中可能的更改。可悲的是,我已经知道我的代码更有可能是有缺陷的,但让别人再说一遍仍然有帮助。谢谢。这里没有缺少遍历列表的函数。该循环是播放动画的循环。但是,在其中一个动画的代码中,有一个地方我在列表中添加了更多动画。因此,情况是在循环本身内部,有一个点将动画添加到列表中,然后调用iterator.remove(),从而导致异常。使用ConcurrentLinkedQueue实际上也有助于解决异常。因此,是另一个线程向集合中添加了一些内容,对吗?不,实际上是同一个线程。它发生在同一个循环中。我的问题是,它在调用树的某个意想不到的地方非常深入,一开始我根本看不到它。如果同一个线程正在更改集合,它不会导致任何并发异常。确实可以。例如,如果您使用迭代器在ArrayList中循环,或者使用For each循环,然后在循环中添加或删除元素,那么您可能会在Iterator.next()或Iterator.hasNext()上收到ConcurrentModificationException—对于fail-fast Iterator,迭代器的javadoc几乎是这样说的(这适用于ArrayList)。我只是从来没有想过迭代器。remove()将引发该异常。谢谢。在列表中没有缺少迭代的函数。该循环是播放动画的循环。但是在其中一个动画的代码中,有一个地方我在列表中添加了更多动画。因此情况是,在该循环本身内,有一个点添加了动画添加到列表,然后单击iterator.remove()调用,导致异常。使用ConcurrentLinkedQueue实际上也应该有助于解决异常。因此,是另一个线程正在向集合中添加某些内容,对吗?不,实际上是同一个线程。它发生在同一个循环中。我的问题是,它在调用树的某个意外事件中非常深入如果同一个线程正在更改集合,它不会导致任何并发异常。确实可以。例如,如果使用迭代器循环通过ArrayList,或者使用For-each循环,然后在循环内添加或删除元素,那么
 E/AndroidHarness(9546): Exception thrown in Thread[GLThread 1260,5,main]