2010-06-29 3 views
17

Я расширяю класс CountDownTimer, чтобы получить некоторые пользовательские функции. В onTick() в случае выполнения некоторых условий я вызываю cancel(), ожидая, что это будет конец, однако onTick() обратный вызов вызывает вызов до достижения обратного отсчета. Итак, как предотвратить это?Как остановить/отменить android CountDownTimer

ответ

18

Метод CountDownTimer.cancel(), кажется, не работает. Вот еще одна нить без решения Timer does not stop in android.

Я бы порекомендовал вам вместо этого использовать Таймер. Он намного более гибкий и может быть отменен в любое время. Это может быть что-то вроде этого:

public class MainActivity extends Activity {  
    TextView mTextField; 
    long elapsed; 
    final static long INTERVAL=1000; 
    final static long TIMEOUT=5000; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     mTextField=(TextView)findViewById(R.id.textview1); 

     TimerTask task=new TimerTask(){ 
      @Override 
      public void run() { 
       elapsed+=INTERVAL; 
       if(elapsed>=TIMEOUT){ 
        this.cancel(); 
        displayText("finished"); 
        return; 
       } 
       //if(some other conditions) 
       // this.cancel(); 
       displayText("seconds elapsed: " + elapsed/1000); 
      } 
     }; 
     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(task, INTERVAL, INTERVAL); 
    } 

    private void displayText(final String text){ 
     this.runOnUiThread(new Runnable(){ 
      @Override 
      public void run() { 
       mTextField.setText(text); 
      }}); 
    } 
} 
+4

Просто сделал падающую в замену CountDownTimer, что вы можете отказаться от в OnTick: https://gist.github.com/737759 –

+0

@GautierHayoun По Вас способом я могу отменить в OnTick, но OnTick () все равно будет вызван, не знаю, почему – Deqing

15

CountDownTimer также работает нормально для меня, но я думаю, что это работает только, если вы звоните его вне CountDownTimer РЕАЛИЗАЦИИ (т.е. не называть его в OnTick).

Звонок внутри тоже не сработал.

+3

Да, вызов его в onTick, похоже, не работает. Я просто позвонил в Finish и попробовал отменить countdowntimer внутри onFinish, и это сработало – Basher51

0

Я пробовал этот фрагмент кода, так как большинство ответов говорят о том, что вы не можете отменить таймер внутри его реализации, поэтому я попытался использовать обработчик внутри onFinish. Старый пост, но если кому-то это поможет.

new Handler().post(new Runnable() { 
      @Override 
      public void run() { 
       timerTextView.setText("00:" + String.format("%02d", counter)); 
       cancel(); 
      } 
     }); 
Смежные вопросы