CountDownTimer.cancel() 在 Android 中不起作用

Posted

技术标签:

【中文标题】CountDownTimer.cancel() 在 Android 中不起作用【英文标题】:CountDownTimer.cancel() is not working in Android 【发布时间】:2011-09-19 09:53:53 【问题描述】:

CountDownTimer.cancel() 在以下代码中不起作用:

myTimer = new CountDownTimer(10000, 1000) 
    public void onFinish() 
    
    @Override
    public void onTick(long millisUntilFinished) 
        if(null != myObject)
            myTimer.cancel();
        
    
.start();

在上面的代码中,我启动了一个CountDownTimer,它检查对象是否不是null,并相应地取消定时器。该对象由某个侦听器在任何时间点设置。 请参考和建议。我在这里做对了吗?

Gautier Hayoun 的解决方案

刚刚做了一个替换 可以取消的 CountDownTimer 从 onTick 内部:Github link– Gautier Hayoun 2010 年 12 月 12 日 1:04

【问题讨论】:

问题可能是您在新创建的对象内引用myTimer。试试this.cancel(); 而不是myTimer.cancel(); 这是 android 错误吗?为此,我真的很沮丧。 【参考方案1】:

Gautier Hayoun 的解决方案:

刚刚替换了 CountDownTimer,您可以从 onTick 中取消:Github link– Gautier Hayoun 2010 年 12 月 12 日 1:04

【讨论】:

这里的处理程序给出警告“这个处理程序类应该是静态的,否则可能会发生泄漏”。阅读:***.com/questions/11407943/…【参考方案2】:

使用TimerTask代替CountDownTimer

final static long INTERVAL=1000;
final static long TIMEOUT=10000;


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);
        
    );

【讨论】:

倒计时的探针是什么? CountDown 有一些取消的问题,通常如果你调用 cancel() 它不会被停止,你将有 2 个定时器同时工作

以上是关于CountDownTimer.cancel() 在 Android 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2游记

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?

存储在 plist 中的数据在模拟器中有效,但在设备中无效

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据