2015-07-09 3 views
1

в моем приложении Я использую CountDownTimer и хочу, чтобы пользователи могли сбросить данные в приложении и начать новый. Проблема, с которой я столкнулась, заключается в том, что если вы запустите таймер, скажем, 3 минуты, а затем через короткое время вы вызываете мою функцию сброса, чтобы вернуть все оценки к их начальным значениям, а затем запустите новый таймер, скажем, 10 минут. ... таймер сразу же поднимает, где он остановился, говоря 2:24, 2:23, 2:22 .....Отмена андроида CountDownTimer

Все, что я читал везде, говорит, что вы вызываете countdowntimername.cancel(); а затем установите countdowntimername = null;

Вот как я это делаю, и это совсем не работает. Должен быть более эффективный способ убить этих таймеров? Есть идеи?

Соус:

private void toggleTimer() { 
    if (timerStarted == false) { 
     final CountDownTimer countDownTimer = new CountDownTimer(startTime, interval) { 

      public void onTick(long millisUntilFinished) { 
        if (timerPaused == true) { 
         cancel(); 
        } else { 
         timeRemaining = millisUntilFinished; 
         long remainder = millisUntilFinished; 
         minuteTens = df.format(millisUntilFinished/600000); 
         remainder = remainder - (Integer.valueOf(minuteTens) * 600000); 
         minuteOnes = df.format(remainder/60000); 
         remainder = remainder - (Integer.valueOf(minuteOnes) * 60000); 
         secondTens = df.format(remainder/10000); 
         remainder = remainder - (Integer.valueOf(secondTens) * 10000); 
         secondOnes = df.format(remainder/1000); 
         setCountdownText(); 
        } 
      } 

      public void onFinish() { 
       minuteTens = "0"; 
       minuteOnes = "0"; 
       secondTens = "0"; 
       secondOnes = "0"; 
       setCountdownText(); 
       timerStarted = false; 
       Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 
       v.vibrate(1000); 
      } 
     }.start(); 
     timerStarted = true; 
    } else { 
     if (timerPaused == false) { 
      pauseTimer(); 
     } else { 
      resumeTimer(); 
     } 
    } 
} 

, а также:

private void resumeTimer() { 
    timerPaused = false; 
    startTime = timeRemaining; 
     CountDownTimer countDownTimer = new CountDownTimer(startTime, interval) { 

      public void onTick(long millisUntilFinished) { 
       if (timerPaused == true) { 
        cancel(); 
       } else { 
        timeRemaining = millisUntilFinished; 
        long remainder = millisUntilFinished; 
        minuteTens = df.format(millisUntilFinished/600000); 
        remainder = remainder - (Integer.valueOf(minuteTens) * 600000); 
        minuteOnes = df.format(remainder/60000); 
        remainder = remainder - (Integer.valueOf(minuteOnes) * 60000); 
        secondTens = df.format(remainder/10000); 
        remainder = remainder - (Integer.valueOf(secondTens) * 10000); 
        secondOnes = df.format(remainder/1000); 
        setCountdownText(); 
       } 
      } 

      public void onFinish() { 
       minuteTens = "0"; 
       minuteOnes = "0"; 
       secondTens = "0"; 
       secondOnes = "0"; 
       setCountdownText(); 
       timerStarted = false; 
       Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 
       v.vibrate(1000); 
      } 
     }.start(); 
    } 

и метод сброса:

private void resetScores() { 
    final TextView P1CountDownTimer = (TextView) findViewById(R.id.P1CountDownTimer); 
    final TextView P2CountDownTimer = (TextView) findViewById(R.id.P2CountDownTimer); 
    timerStarted = false; 
    timerPaused = false; 
    minuteTens = "0"; 
    minuteOnes = "0"; 
    secondTens = "0"; 
    secondOnes = "0"; 
    if (countDownTimer != null) { 
     countDownTimer.cancel(); 
     countDownTimer = null; 
    } 
    setCountdownText(); 
    P1CountDownTimer.setVisibility(View.INVISIBLE); 
    P2CountDownTimer.setVisibility(View.INVISIBLE); 
} 

Редактировать:

Это также актуально. Вот как я создаю экземпляр таймера в первую очередь, а затем снова после сброса. Принимает данные от пользователя и преобразует его в миллисекундах, чтобы пройти в countdowntimer:

private void resetTimer() { 
    final TextView P1CountDownTimer = (TextView) findViewById(R.id.P1CountDownTimer); 
    final TextView P2CountDownTimer = (TextView) findViewById(R.id.P2CountDownTimer); 
    startTime = ((Tens * 60) + (Ones)) * 1000; 
    timeRemaining = startTime; 
    if (startTime > 0) { 
     long remainder = startTime; 
     minuteTens = df.format(startTime/600000); 
     remainder = remainder - (Integer.valueOf(minuteTens) * 600000); 
     minuteOnes = df.format(remainder/60000); 
     remainder = remainder - (Integer.valueOf(minuteOnes) * 60000); 
     secondTens = df.format(remainder/10000); 
     remainder = remainder - (Integer.valueOf(secondTens) * 10000); 
     secondOnes = df.format(remainder/1000); 
     setCountdownText(); 
     P1CountDownTimer.setVisibility(View.VISIBLE); 
     P2CountDownTimer.setVisibility(View.VISIBLE); 
    } 
} 

ответ

1

Оказывается, путь, чтобы сделать его работу, чтобы сделать таймер глобального, а затем вызвать отмены на глобальной переменной.
См https://stackoverflow.com/a/27730328/1410671 и https://stackoverflow.com/a/23630959/1410671

Я предполагаю, что эти методы все в классе деятельности, в этом случае вы бы объявить CountDownTimer в верхней части класса активность

private CountDownTimer countDownTimer; 

, а затем обратиться к нему позднее другими способами, такими как

countDownTimer = new CountDownTimer(startTime, interval) {...}