как остановить / отменить Android CountDownTimer - PullRequest
17 голосов
/ 29 июня 2010

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

Ответы [ 3 ]

18 голосов
/ 02 июля 2010

Метод CountDownTimer.cancel (), похоже, не работает. Вот еще один поток без решения Таймер не останавливается в 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);
            }});
    }
}
15 голосов
/ 21 ноября 2010

CountDownTimer также отлично работает для меня, но я думаю, что он работает только в том случае, если вы называете его вне реализации CountDownTimer (то есть не вызывайте его в onTick).

Вызов внутри тоже не сработал.

0 голосов
/ 24 ноября 2016

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

new Handler().post(new Runnable() {
            @Override
            public void run() {
                timerTextView.setText("00:" + String.format("%02d", counter));
                cancel();
            }
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...