Я расширяю класс CountDownTimer, чтобы получить некоторые пользовательские функции. В onTick() в случае выполнения некоторых условий я вызываю cancel(), ожидая, что это будет конец, однако обратный вызов onTick() вызывает вызов до достигается обратный отсчет. Итак, как предотвратить это?
Как остановить/отменить андроид CountDownTimer
Ответ 1
Метод CountDownTimer.cancel(), похоже, не работает. Здесь еще один поток без решения Таймер не останавливается на андроиде.
Я бы порекомендовал вам использовать Timer. Он намного более гибкий и может быть отменен в любое время. Это может быть что-то вроде этого:
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);
}});
}
}
Ответ 2
CountDownTimer также отлично работает для меня, но я думаю, что он работает только в том случае, если вы назовете его OUTSIDE из функции CountDownTimer (то есть не называйте это в onTick).
Вызов его внутри тоже не сработал.
Ответ 3
Я пробовал этот фрагмент кода, так как большинство ответов говорят о том, что вы не можете отменить таймер внутри его реализации, поэтому я попытался использовать обработчик внутри onFinish. Старый пост, но если кому-то это поможет.
new Handler().post(new Runnable() {
@Override
public void run() {
timerTextView.setText("00:" + String.format("%02d", counter));
cancel();
}
});