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

并发修改异常:向ArrayList添加

并发修改异常:向ArrayList添加

慕雪6442864 2019-07-17 18:23:03
并发修改异常:向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贡献1853条经验 获得超6个赞

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-07-17
?
动漫人物

TA贡献1815条经验 获得超10个赞

我通常用这样的方法:

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

快速干净无虫

另一个选项是使用CopyOnWriteArrayList


查看完整回答
反对 回复 2019-07-17
?
拉丁的传说

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

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

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

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

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


查看完整回答
反对 回复 2019-07-17
  • 3 回答
  • 0 关注
  • 700 浏览

添加回答

举报

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