我在一个单线程案例中得到了一个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 ......
答案 0 :(得分:0)
你确定这里没有其他功能可以迭代列表吗?也许是播放动画的东西?
另外,如果这没有帮助,请尝试使用“ConcurrentLinkedQueue”: http://developer.android.com/reference/java/util/concurrent/ConcurrentLinkedQueue.html 它适用于所有版本,它表示对于迭代器: “...返回的迭代器是一个”弱一致“的迭代器,它永远不会抛出ConcurrentModificationException,并保证遍历构造迭代器时存在的元素,并且可能(但不保证)反映构造之后的任何修改。 “