Подтвердить что ты не робот

Как остановить/отменить андроид CountDownTimer

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

4b9b3361

Ответ 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();
            }
        });