Я разрабатываю игру и имею проблему с отключением countdowntimer. Таймер запускается нормально, как следует, и должен останавливаться в методе end(). Он хорошо работает, когда ENEMY_HULL проверяется как 0 или меньше, который вызывается отдельно, когда пользователи нажимают кнопку, и вызывается функция checkEnemyDefeat(), но это не работает, когда ENEMY_CREW равно 0. В обеих ситуациях сообщение в log cat, что таймер остановлен, поэтому я предполагаю, что вызывается .cancel(). Я включил весь код, который кажется релевантным.Android: Count Down Timer .cancel() не работает
Примечание: Все переменные, включая CountDownTimer глобальные переменные
Вот метод, содержащий таймер:
private void BadGameLoop() {
if (GAME_PAUSED == true && !GAME_TIME_STARTED) {
Log.d(" -------- ", "TIMER STARTED");
GAME_PAUSED = false;
GAME_TIME_STARTED = true;
gameTimer = new CountDownTimer(GAME_TIME, UPDATE_RATE) {
@Override
public void onTick(long millisUntilFinished) {
TICKS++;
timer.setText(String.valueOf(GAME_TIME/1000 - TICKS/10));
if((CREW_BOARDING > 0 || ENEMY_CREW_BOARDING > 0) && TICKS%10 == 0){
crewFightCalculator();
}
updateViews();
}
@Override
public void onFinish() {
TICKS=0;
GAME_TIME_STARTED = false;
GAME_PAUSED = true;
end();
}
};gameTimer.start();
}
}
Следующая является метод crewFightCalculator:
private void crewFightCalculator(){
// this just changes the values of ENEMY_CREW (global variable) and then
//calls checkEnemyDefeat() to verify if it should end the timer or not
checkEnemyDefeat();
}
checkEnemyDefeat и конечные методы :
private void checkEnemyDefeat(){
if(ENEMY_HULL <= 0){
updateViews();
end();
}else if (ENEMY_CREW < 1){
updateViews();
end();
}
}
private void end(){
if(GAME_TIME_STARTED){
GAME_TIME_STARTED = false;
gameTimer.cancel();
Log.d("---------"," TIMER STOPPED !");
}
// do more stuff
}
Это просто bizzare для меня, почему он не работает. Мое единственное предположение, что это связано с тем, что .cancel() не запускается цепочкой функций, запускаемых пользователем.
У вас есть 'gameTimer' как глобальная переменная, правильно? Попробуйте поставить ниже отменить gameTimer.onFinish(); –
В противном случае попробуйте сделать его статическим, как 'private static CountDownTimer gameTimer;' –
Действительно CountDownTimer - статическая глобальная переменная. Я попытался поставить gameTimer.onFinish() ниже cancel(), но это просто перезапустило таймер .. weird ... –