猿问

请问并发修改异常:向ArrayList添加

并发修改异常:向ArrayList添加

这个问题发生在

Element element = it.next();

包含该行的代码位于OnTouchEvent

for (Iterator<Element> it = mElements.iterator(); it.hasNext();){
    Element element = it.next();

    if(touchX > element.mX  && touchX < element.mX + element.mBitmap.getWidth() && touchY > element.mY   
            && touchY < element.mY + element.mBitmap.getHeight()) {  

        //irrelevant stuff..

        if(element.cFlag){
            mElements.add(new Element("crack",getResources(), (int)touchX,(int)touchY));
            element.cFlag = false;

        }           
    }
}

所有这些都在里面synchronized(mElements),在哪里mElementsArrayList<Element>

当我触摸Element,它可能会激活cFlag,这将产生另一个Element有着不同的属性,这些属性会在不到一秒钟的时间内从屏幕上掉下来并摧毁自己。这是我创造粒子效应的方法。我们可以称之为“粒子”crack,类似于构造函数中的字符串参数。

在我添加另一个main之前,所有这些都可以正常工作。Element..现在我有两个Elements同时在屏幕上,如果我触摸最新的Element它工作得很好,并发射粒子。

但是,如果我触摸并激活cFlag老一点Element它给了我一个例外。


月关宝盒
浏览 419回答 3
3回答

缥缈止盈

ConcurrentModificationException修改列表(通过添加或移除元素)时发生。Iterator.试一试List<Element>&nbsp;thingsToBeAdd&nbsp;=&nbsp;new&nbsp;ArrayList<Element>(); for(Iterator<Element>&nbsp;it&nbsp;=&nbsp;mElements.iterator();&nbsp;it.hasNext();)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;Element&nbsp;element&nbsp;=&nbsp;it.next(); &nbsp;&nbsp;&nbsp;&nbsp;if(...)&nbsp;{&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//irrelevant&nbsp;stuff.. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(element.cFlag){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;mElements.add(new&nbsp;Element("crack",getResources(),&nbsp;(int)touchX,(int)touchY)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thingsToBeAdd.add(new&nbsp;Element("crack",getResources(),&nbsp;(int)touchX,(int)touchY)); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;element.cFlag&nbsp;=&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;} } mElements.addAll(thingsToBeAdd&nbsp;);此外,正如Jon建议的那样,您应该考虑对每个循环进行增强。

慕运维8079593

我通常用这样的方法:for&nbsp;(Element&nbsp;element&nbsp;:&nbsp;new&nbsp;ArrayList<Element>(mElements))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;... }快速干净无虫另一个选项是使用CopyOnWriteArrayList

料青山看我应如是

在迭代集合时,不允许将条目添加到集合中。一种选择是创建一个新的List<Element>当你在迭代的时候,新的条目mElements,然后将所有新的添加到mElement事后(mElements.addAll(newElements))。当然,这意味着您不会对这些新元素执行循环主体-这是一个问题吗?同时,我建议您更新代码以使用增强型循环:for&nbsp;(Element&nbsp;element&nbsp;:&nbsp;mElements)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;... }
随时随地看视频慕课网APP

相关分类

Java
我要回答