【问题标题】:how to stop/cancel android CountDownTimer如何停止/取消android CountDownTimer
【发布时间】:2016-11-25 00:04:50
【问题描述】:

我正在扩展 CountDownTimer 类以获得一些自定义功能。在 onTick() 中,如果满足某些条件,我会调用 cancel() ,期望这将结束,但是 onTick() 回调会被调用,直到倒计时已到。那么如何防止这种情况发生呢?

【问题讨论】:

    标签: android


    【解决方案1】:

    CountDownTimer.cancel() 方法似乎不起作用。这是另一个没有解决方案的线程Timer does not stop in android

    我建议您改用 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);
                }});
        }
    }
    

    【讨论】:

    • 刚刚替换了 CountDownTimer,您可以在 onTick 中取消它:gist.github.com/737759
    • @GautierHayoun 通过你的方法我可以在onTick中取消,但是onTick()仍然会被调用,不知道为什么
    【解决方案2】:

    CountDownTimer 对我来说也可以正常工作,但我认为它只有在 CountDownTimer 实现之外调用它才有效(即不要在 onTick 中调用它)。

    在里面调用它也没有用。

    【讨论】:

    • 是的,在 onTick 中调用它似乎不起作用。我强行调用 onFinish 并尝试取消 onFinish 中的倒数计时器,它起作用了
    【解决方案3】:

    我尝试了这段代码 sn-p,因为大多数答案都说您无法在其实现中取消计时器,因此我尝试在 onFinish 中使用处理程序。旧帖子,但如果有人遇到它,它会很有帮助。

    new Handler().post(new Runnable() {
                @Override
                public void run() {
                    timerTextView.setText("00:" + String.format("%02d", counter));
                    cancel();
                }
            });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多