Android surfaceView上的java.util.ConcurrentModificationException

Android surfaceView上的java.util.ConcurrentModificationException,android,Android,我正在android上开发一个游戏,我遇到了一个循环的问题,这个循环迭代了一个僵尸数组列表。如果我减去僵尸,应用程序仍在运行,但当我添加僵尸时,应用程序会随机崩溃。 我知道,当我向zombies ArrayList添加一个项时,问题就开始了,并使线程抛出异常 这是我从LogCat得到的一个例外 07-19 20:55:02.960: ERROR/AndroidRuntime(19526): FATAL EXCEPTION: Thread-9 07-19 20:55:02.960: ERROR/A

我正在android上开发一个游戏,我遇到了一个循环的问题,这个循环迭代了一个僵尸数组列表。如果我减去僵尸,应用程序仍在运行,但当我添加僵尸时,应用程序会随机崩溃。 我知道,当我向zombies ArrayList添加一个项时,问题就开始了,并使线程抛出异常

这是我从LogCat得到的一个例外

07-19 20:55:02.960: ERROR/AndroidRuntime(19526): FATAL EXCEPTION: Thread-9
07-19 20:55:02.960: ERROR/AndroidRuntime(19526): java.util.ConcurrentModificationException
07-19 20:55:02.960: ERROR/AndroidRuntime(19526):     at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
07-19 20:55:02.960: ERROR/AndroidRuntime(19526):     at com.funkytron.android.killthemall.GameView.onDraw(GameView.java:131)
07-19 20:55:02.960: ERROR/AndroidRuntime(19526):     at com.funkytron.android.killthemall.GameLoopThread.run(GameLoopThread.java:34)
这里是我迭代僵尸数组列表的几行,如果任何僵尸与精灵发生碰撞,它会杀死它们并添加一个僵尸

        for (Iterator<Zombie> zombieIterator = zombieCollection.iterator(); zombieIterator.hasNext();)
        {
            Zombie zombie = zombieIterator.next();
                zombie.onDraw(canvas);

                for(Iterator<Sprite> sprite = sprites.iterator(); sprite.hasNext();)
                {
                    Sprite s = sprite.next();
                    if(zombie.isCollision(s.getX(), s.getY()))
                    {
                        die(s, zombie.getX(), zombie.getY());
                        break;
                    }
                }

        }

我尝试使用临时数组列表,但它引发了相同的异常,我希望您能理解我难听的英语

要在迭代集合时从集合中删除某些内容,您需要使用迭代器中的
remove
方法。见:

您的代码应该如下所示:

for (Zombie zombie :  zombieCollection)
{

      zombie.onDraw(canvas);

        for(Iterator<Sprite> spriteIterator = sprites.iterator(); sprite.hasNext();)
        {
            Sprite s = spriteIterator.next();
            if(zombie.isCollision(s.getX(), s.getY()))
            {
                die(spriteIterator, zombie.getX(), zombie.getY());
                break;
            }
        }

}

public void die(Iterator spriteIterator, float x, float y)
{
    spriteIterator.remove();
    zombieCollection.add(createZombie(R.drawable.zombie,0,0));
    temps.add(new TempSprite(temps, this, x, y, bmpBlood));
    addPoints = true;
}
for(僵尸:僵尸集合)
{
僵尸。onDraw(画布);
for(迭代器spriteiteiterator=sprites.Iterator();sprite.hasNext();)
{
Sprite s=spriteiteiterator.next();
if(zombie.isCollision(s.getX(),s.getY())
{
死亡(spriteIterator,zombie.getX(),zombie.getY());
打破
}
}
}
公共无效骰子(迭代器spriteiteiterator、浮点x、浮点y)
{
spriteIterator.remove();
添加(createZombie(R.drawable.zombie,0,0));
添加(新的TempSprite(temps,this,x,y,bmpBlood));
addPoints=true;
}

将您的逻辑与做某事和在屏幕上绘制结果分开:

for (Zombie zombie :  zombieCollection) {
    for (Sprite sprite : sprites) {
        if (zombie.isCollision(sprite.getX(), sprite.getY())) {
            sprite.markAsZombified();
            break;
        }
    }
}

for (Iterator<Sprite> spriteIterator = sprites.iterator(); sprite.hasNext();) {
    Sprite sprite = spriteIterator.next();
    if (sprite.isZombified()) {
         spriteIterator.remove();
         Zombie newZombie = createZombie();
         zombieCollections.add(newZombie);
    }
}

for (Zombie zombie :  zombieCollection) {
    zombie.onDraw(canvas);
}
for(僵尸:僵尸集合){
用于(精灵精灵:精灵){
if(zombie.isCollision(sprite.getX(),sprite.getY()){
sprite.markAsZombified();
打破
}
}
}
for(迭代器spriteiteiterator=sprites.Iterator();sprite.hasNext();){
Sprite-Sprite=spriteiteiterator.next();
if(sprite.isZombified()){
spriteIterator.remove();
Zombie newZombie=createZombie();
zombieCollections.add(newZombie);
}
}
用于(僵尸僵尸:僵尸收藏){
僵尸。onDraw(画布);
}

代码没有经过测试,只是一个示例。

很好。我只是想画一个草图,太专注于移除物品了。
for (Zombie zombie :  zombieCollection) {
    for (Sprite sprite : sprites) {
        if (zombie.isCollision(sprite.getX(), sprite.getY())) {
            sprite.markAsZombified();
            break;
        }
    }
}

for (Iterator<Sprite> spriteIterator = sprites.iterator(); sprite.hasNext();) {
    Sprite sprite = spriteIterator.next();
    if (sprite.isZombified()) {
         spriteIterator.remove();
         Zombie newZombie = createZombie();
         zombieCollections.add(newZombie);
    }
}

for (Zombie zombie :  zombieCollection) {
    zombie.onDraw(canvas);
}