java - 重启时游戏有时会崩溃

标签 java android arraylist crash draw

你好 stackoverflow 社区, 我需要一些帮助。这个 ConcurrentModificationException 错误让我抓狂!我最近刚刚开始一般的 Android 游戏开发和编程。

当我玩我的游戏时它完美无瑕,但有时如果我尝试开始一个新游戏它会崩溃。 Logcat 在我的代码中显示了这两行,但我不知道如何修复它,因为它们在我看来是正确的:/

public void run() {
    while (playing) {
        update();
        draw(); //the draw-method is marked
        control(); } }

在我的绘制方法中:

 // I draw the SpaceDust from an ArrayList
 paint.setColor(Color.argb(255, 255, 255, 255));
        for (SpaceDust sd : dustList) {
            canvas.drawPoint(sd.getX(), sd.getY(), paint); }

有什么想法吗? 谢谢尼克拉斯

编辑:LogCat 输出

FATAL EXCEPTION: Thread-146798 
Process: niclas.spacegame, PID: 7983
java.util.ConcurrentModificationException
at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
at niclas.spacegame.GameActivity$TDView.update(GameActivity.java:285)
at niclas.spacegame.GameActivity$TDView.run(GameActivity.java:206)
at java.lang.Thread.run(Thread.java:818)

编辑:更新方法 私有(private)无效更新(){ boolean hitDetected = false; if(Rect.intersects(player.getHitbox(), enemy1.getHitbox())){ hitDetected = true; enemy1.setX(-100); } if(Rect.intersects(player.getHitbox(), enemy2.getHitbox())){ hitDetected = true; enemy2.setX(-100); } if(Rect.intersects(player.getHitbox(), enemy3.getHitbox())){ hitDetected = true; enemy3.setX(-100); } 如果(屏幕 X > 1000){ if(Rect.intersects(player.getHitbox(), enemy4.getHitbox())){ hitDetected = true; enemy4.setX(-100); } } 如果(屏幕 X > 1200){ if(Rect.intersects(player.getHitbox(), enemy3.getHitbox())){ hitDetected = true; enemy5.setX(-100); } } 如果(命中检测){ soundPool.play(bump, 1, 1, 0, 0, 1); player.reduceShieldStrength(); 如果 (player.getShieldStrength() < 0) { soundPool.play(销毁, 1, 1, 0, 0, 1); 游戏结束=真; }

    player.update();
    enemy1.update(player.getSpeed());
    enemy2.update(player.getSpeed());
    enemy3.update(player.getSpeed());
    if(screenX > 1000) {
        enemy4.update(player.getSpeed());
    }
    if(screenX > 1200) {
        enemy5.update(player.getSpeed());
    }
    for (SpaceDust sd : dustList) {
        sd.update(player.getSpeed());
    }
    if(!gameEnded) {
        distanceRemaining -= player.getSpeed();
        timeTaken = System.currentTimeMillis() - timeStarted;
    }
    if(distanceRemaining < 0){
        soundPool.play(win, 1, 1, 0, 0, 1);
        if(timeTaken < fastestTime) {
            editor.putLong("fastestTime", timeTaken);
            editor.commit();
            fastestTime = timeTaken;
        }
        distanceRemaining = 0;
        gameEnded = true;
    }
}

最佳答案

您可能正在从列表中删除一个元素,同时在其他地方使用“for each”循环访问它。

首先,使用迭代器代替,但也将您对数组列表的访问包装在一个同步块(synchronized block)中:

替换:

    for (SpaceDust sd : dustList) {
        sd.update(player.getSpeed());
    }

与:

synchronized(dustList){
        Iterator<SpaceDust> it = dustList.iterator();

        while (it.hasNext() {
           SpaceDust sd = it.next();
           sd.update(player.getSpeed());
        }
}

并将列表修饰符包装在同步块(synchronized block)中:

synchronized(dustList){
    int numSpecs = 400;
    for (int i = 0; i < numSpecs; i++) { 
        SpaceDust spec = new SpaceDust(screenX, screenY); 
        dustList.add(spec); 
    } 
}

这种方法效率很低,但应该可以解决您的问题。这会锁定数组列表,因此在您读取或写入时无法修改它。

关于java - 重启时游戏有时会崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34652907/

相关文章:

java - 如何创建 Set<String> 数组?

java - 使用java从liferay cms检索内容

java - Spring和卡夫卡: Join 3 Kafka topics to generate output Kafka streams

java - 如何使用扫描仪库并使用嵌入式扫描仪在 Android 应用程序的后台进行扫描?

android - minifyEnabled true 时构建 APK 时出错

java - Android以编程方式获取edittext文本

java - TomEE 抛出 IndexOutOfBoundsException

android - Youtube Iframe 中的黑屏(Android 应用程序)

android - 如何在更改文本输入时使用异步任务执行搜索服务

java - 如何将嵌套数组列表转换为数组列表?