Android surfaceView上的java.util.ConcurrentModificationException
我正在android上开发一个游戏,我遇到了一个循环的问题,这个循环迭代了一个僵尸数组列表。如果我减去僵尸,应用程序仍在运行,但当我添加僵尸时,应用程序会随机崩溃。 我知道,当我向zombies ArrayList添加一个项时,问题就开始了,并使线程抛出异常 这是我从LogCat得到的一个例外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
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);
}