所以我查看了很多来源,每当出现这样的问题时,都是因为倒计时器试图从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吗?否则我真的没有想法!感谢。
答案 0 :(得分:0)
虽然您已经努力发布相关的代码片段,但我很难想象它们是如何组合在一起的。例如,当您为每个数据对象创建Runnable
时,调用是否真的在run()
方法中设置并启动倒数计时器,如图所示?我想知道当时data
和i
是如何可访问的。如果它们真的可以访问,那么当i
从队列中出来并执行时,您如何知道Runnable
将具有所需的值?
我同意cancel()会导致CountDownTimer
停止。但请注意,如果在start()
之后调用cancel()
,计时器将重新开始 - 这不是一次性的。如果错误导致第二次调用start()
,则看起来取消不起作用。
我可以建议您在整个代码中添加一堆Log
语句,以确认您关于计时器何时开始和被取消的假设,以及i
对每个实例的价值是什么
答案 1 :(得分:0)
这对我来说是一个非常愚蠢的错误。当我从数据列表中删除对象时,我通过以下方式取消了警报: 。data.get(ⅰ).getCountDownTimer()取消(); 然后我删除了该对象,并发送了notifyitemremoved。错误是我应该发送通知,并且在onbind中,我应该取消它。然后我应该安全地删除该条目,因为知道CTD已被取消。无论如何,感谢大家的投入。