2016-01-07 4 views
1

Привет, сообщество stackoverflow, Мне нужна помощь plz. Эта ошибка ConcurrentModificationException делает меня сумасшедшим! Недавно я начал разработку и разработку игр для Android в целом.Игры иногда возникают при перезагрузке

Когда я играть свою игру его безупречна, но Sometims если им пытаются начать новую игру, он выходит из строя. 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); } 

Есть идеи? Благодаря Никлас

Edit: выход 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) 

Edit: обновление-метод частное аннулируются обновление() { булево hitDetected = ложь; if (Rect.intersects (player.getHitbox(), enemy1.getHitbox())) { hitDetected = true; enemy1.setX (-100); } , если (Rect.intersects (player.getHitbox(), enemy2.getHitbox())) { hitDetected = TRUE; enemy2.setX (-100); } , если (Rect.intersects (player.getHitbox(), enemy3.getHitbox())) { hitDetected = TRUE; enemy3.setX (-100); } if (screenX> 1000) { if (Rect.intersects (player.getHitbox(), enemy4.getHitbox())) { hitDetected = true; enemy4.setX (-100); } } if (screenX> 1200) { if (Rect.intersects (player.getHitbox(), enemy3.getHitbox())) { hitDetected = true; enemy5.setX (-100); }} , если (hitDetected) { soundPool.play (выпуклость, 1, 1, 0, 0, 1); player.reduceShieldStrength(); , если (player.getShieldStrength() < 0) { soundPool.play (разрушен, 1, 1, 0, 0, 1); gameEnded = true; }}

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; 
    } 
} 
+0

Делает ли 'drawPoint' или что-нибудь, что он называет, пытается изменить' dustList'? – khelwood

+1

Вы забыли добавить logcat. –

+0

почтовый индекс от метода обновления. Исключение происходит из метода обновления. –

ответ

1

Вы, вероятно, удаление элемента из списка в то время как доступ к нему с «для каждого» цикла где-то в другом месте.

Во-первых, использовать итератор вместо, но и обернуть доступ к списку массива в синхронизированный блок:

Заменить:

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(dustList){ 
    int numSpecs = 400; 
    for (int i = 0; i < numSpecs; i++) { 
     SpaceDust spec = new SpaceDust(screenX, screenY); 
     dustList.add(spec); 
    } 
} 

Этот подход довольно неэффективен, но он должен решить вашу проблему.Это блокирует список массивов, поэтому он не может быть изменен во время чтения или записи.

+0

Я все еще получаю ту же ошибку. Но за вашу помощь. – Niclas

+0

ОК, нужно будет увидеть больше кода, чтобы диагностировать это. Вам нужно увидеть какой-либо код, который изменяет ваш ArrayList –

+0

, очевидно, что вы должны удалять элементы из списка пылесосов где-то в вашем коде? Покажите нам, что код –

Смежные вопросы