Рассчитать все стычки
Ваш текущий код делает это, потому что цикл while фактически не останавливается, чтобы ждать.Процесс будет выглядеть следующим образом:
введите цикл while -> вызвать displayWarriors () -> создать CountDownTimer (), чтобы сделать что-то через 2 секунды -> вернуться к циклу while -> вызвать displayBrigands () -> создать CountDownTimer() чтобы сделать что-то через 2 секунды -> вернуться к циклу while -> делать то же самое, пока вы не выйдете, пока
С этим кодом вы получите кучу CountDownTimers, которые создаются и выполняются одновременно(почти) раз, поэтому через две секунды все они пытаются установить представление на какое-то значение (с неопределенным поведением, как вы упомянули, что это происходит).
Есть несколько способов сделать то, что вы хотите.Вы можете использовать поток, например:
void fightBattle(){
setContentView(R.layout.brigands);
new Thread(new Runnable() {
public void run() {
// I assume R.layout.brigands is the initial screen that you want to show for 2 seconds?!? In this case wait 2 seconds
TimeUnit.Seconds.sleep(2);
boolean winnerDetermined = false;
while(!winnerDetermined) {
// ...
// from your code it seems you want to show this for 2 seconds?
displayWarriors(player);
TimeUnit.Seconds.sleep(2);
//...
displayBrigands();
// also show this for 2 seconds
TimeUnit.Seconds.sleep(2);
// ...
}
}
}).start();
}
Тогда ваши методы отображения будут выглядеть примерно так:
private void displayWarriors(Player player){
// you need to wrap this code in a runOnUiThread() method(from the activity)
// because we are on a background thread and we are changing views!
final Player currentPlayer = player;
setContentView(R.layout.warriors);
TextView warrior_count_tv = findViewById(R.id.warrior_count_tv);
warrior_count_tv.setText(currentPlayer.getWarriors());
}
Другой подход заключается в использовании обработчика и разбиении вашего кода в Runnables.что вы тогда планируете в подходящее время.