2015-08-29 4 views
0

Я разрабатываю игру и имею проблему с отключением 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() не запускается цепочкой функций, запускаемых пользователем.

+0

У вас есть 'gameTimer' как глобальная переменная, правильно? Попробуйте поставить ниже отменить gameTimer.onFinish(); –

+0

В противном случае попробуйте сделать его статическим, как 'private static CountDownTimer gameTimer;' –

+0

Действительно CountDownTimer - статическая глобальная переменная. Я попытался поставить gameTimer.onFinish() ниже cancel(), но это просто перезапустило таймер .. weird ... –

ответ

0

Единственное решение этой проблемы, которую я нашел, был изменить метод OnTick, так что он должен проверять каждый раз, если он должен запустить или остановить таймер, как это:

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) { 
     if(GAME_TIME_STARTED) { 
      TICKS++; 

      timer.setText(String.valueOf(GAME_TIME/1000 - TICKS/10)); 



      if((CREW_BOARDING > 0 || ENEMY_CREW_BOARDING > 0) && TICKS%10 == 0){ 
       crewFightCalculator(); 
      } 
      updateViews(); 

     }else{ 
      gameTimer.cancel(); 
     }} 
     @Override 
     public void onFinish() { 

      TICKS=0; 
      GAME_TIME_STARTED = false; 
      GAME_PAUSED = true; 
      end(); 
     } 
    };gameTimer.start(); 
} 
} 

Тем не менее, я могу Подумайте, почему он не работал должным образом.

+0

Другими словами, метод 'cancel' не работает, и итерации будут продолжены. Таким образом, 'else' в коде не требуется, и сам класс является проблемой :( – JCarlos