CountdownTimer没有被取消

时间:2015-07-13 20:47:24

标签: java android countdowntimer

所以我查看了很多来源,每当出现这样的问题时,都是因为倒计时器试图从ontick中取消。这不是我的问题。我有一个可运行的倒数计时器。我取消了计时器,取消了runnable,它仍以某种方式被调用。以下是一些代码。我感谢任何帮助!

public void onCellEdit(CellEditEvent event) {
        Object oldValue = event.getOldValue();
        Object newValue = event.getNewValue();
        printRowValues();
        if(newValue != null && !newValue.equals(oldValue)) {
            logger.debug("Old: " + oldValue + ", New:" + newValue);
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cell Changed", "Old: " + oldValue + ", New:" + newValue);
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
}

启动功能基本上是:

Handler myHandler = new Handler();
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        CountDownTimer countdownTimer = new CountDownTimer(difference - (1000 * 60) + 2000, 60000) {
            public void onTick(long millisUntilFinished) {          // some work here
            }
            public void onFinish() {
            // some other work here
        };
        data.get(i).setCountDownTimer(countdownTimer);
        data.get(i).getCountDownTimer().start();
    }
};
data.get(i).setHandler(myHandler);
data.get(i).setRunnable(runnable);
data.get(i).start(2000);

data只是一个对象列表,每个对象都有自己的runnable,handler和countdowntimer。

以下是我取消时所做的事情:

public void start(int milliseconds){
    handler.postDelayed(runnable, milliseconds);
}

终止功能基本上是:

 data.get(i).getCountDownTimer().cancel();
 data.get(i).terminate();

有人请告诉我为什么倒计时器在我取消它之后仍以某种方式运行;谢谢!

更新

在onFinish中,我的另一个倒计时间隔较小。当我取消CountDownTimer时是onFinish吗?否则我真的没有想法!感谢。

2 个答案:

答案 0 :(得分:0)

虽然您已经努力发布相关的代码片段,但我很难想象它们是如何组合在一起的。例如,当您为每个数据对象创建Runnable时,调用是否真的在run()方法中设置并启动倒数计时器,如图所示?我想知道当时datai是如何可访问的。如果它们真的可以访问,那么当i从队列中出来并执行时,您如何知道Runnable将具有所需的值?

我同意cancel()会导致CountDownTimer停止。但请注意,如果在start()之后调用cancel(),计时器将重新开始 - 这不是一次性的。如果错误导致第二次调用start(),则看起来取消不起作用。

我可以建议您在整个代码中添加一堆Log语句,以确认您关于计时器何时开始和被取消的假设,以及i对每个实例的价值是什么

答案 1 :(得分:0)

这对我来说是一个非常愚蠢的错误。当我从数据列表中删除对象时,我通过以下方式取消了警报:  。data.get(ⅰ).getCountDownTimer()取消(); 然后我删除了该对象,并发送了notifyitemremoved。错误是我应该发送通知,并且在onbind中,我应该取消它。然后我应该安全地删除该条目,因为知道CTD已被取消。无论如何,感谢大家的投入。