为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

月关宝盒 2019-08-01 06:01:28
并发修改异常:向ArrayList添加这个问题发生在Element element = it.next();包含该行的代码位于OnTouchEventfor (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),在哪里mElements是ArrayList<Element>当我触摸Element,它可能会激活cFlag,这将产生另一个Element有着不同的属性,这些属性会在不到一秒钟的时间内从屏幕上掉下来并摧毁自己。这是我创造粒子效应的方法。我们可以称之为“粒子”crack,类似于构造函数中的字符串参数。在我添加另一个main之前,所有这些都可以正常工作。Element..现在我有两个Elements同时在屏幕上,如果我触摸最新的Element它工作得很好,并发射粒子。但是,如果我触摸并激活cFlag老一点Element它给了我一个例外。
查看完整描述

3 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

ConcurrentModificationException修改列表(通过添加或移除元素)时发生。Iterator.

试一试

List<Element> thingsToBeAdd = new ArrayList<Element>();
for(Iterator<Element> it = mElements.iterator(); it.hasNext();) {
    Element element = it.next();
    if(...) {  
        //irrelevant stuff..
        if(element.cFlag){
            // mElements.add(new Element("crack",getResources(), (int)touchX,(int)touchY));
            thingsToBeAdd.add(new Element("crack",getResources(), (int)touchX,(int)touchY));
            element.cFlag = false;
        }           
    }
}
mElements.addAll(thingsToBeAdd );

此外,正如Jon建议的那样,您应该考虑对每个循环进行增强。




查看完整回答
反对 回复 2019-08-02
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

我通常用这样的方法:

for (Element element : new ArrayList<Element>(mElements)) {
    ...
}

快速干净无虫

另一个选项是使用CopyOnWriteArrayList




查看完整回答
反对 回复 2019-08-02
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

在迭代集合时,不允许将条目添加到集合中。

一种选择是创建一个新的List<Element>当你在迭代的时候,新的条目mElements,然后将所有新的添加到mElement事后(mElements.addAll(newElements))。当然,这意味着您不会对这些新元素执行循环主体-这是一个问题吗?

同时,我建议您更新代码以使用增强型循环:

for (Element element : mElements) {
    ...
}



查看完整回答
反对 回复 2019-08-02
  • 3 回答
  • 0 关注
  • 418 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信