我有一个功能按下(int id),根据它是打开/关闭以及计时器是打开还是关闭来打开/关闭门。它的工作方式是:
门开始关闭。我按下它一次然后打开一个5s计时器设置,它将自动关闭门
如果我再次按下它,在计时器用完之前(仍然打开)它将禁用计时器并永久打开门
如果我再次按下它,当门永远打开时,它会关闭。
问题是......我去按一次。它工作,并设置计时器。但是当我第二次按它时,我会调用t.cancel,但这并不能取消定时器。由于它给出的错误(测试用例失败)非常清楚,计时器仍然完成,并在5秒内关闭门。 (我在5秒之前尝试了50毫秒并且它是打开的; 5秒后50毫秒它被关闭了。)
我认为这是因为当我第二次按下时,它会创建一个新的计时器t,这就是第二次按下时取消的计时器。
如何取消第一个按下计时器,以便它能按照我想要的方式工作?
小注意:我已经尝试将定时器拉出来,只是将它用作调用按键的对象的变量,但是这不起作用(我测试检查),因为很明显,如果你在定时器上调用cancel ,你无法重新激活它,你必须创建一个新的。因此,它必须保持在press(int)函数内。
功能代码:
public void press(int id) {
Timer t2 = new Timer();
if (okIds.contains(id)) {// if the remote is accepted by the door
// if the delay is set to 0 the door stays open
// timer is not enabled (disabled by default)
if (!isOpen() && CLOSE_DELAY == 0) {
controller.open();
}
// if the delay is set to a viable number and the door is closed
// open the door, enable the delay, set timer to the given time
else if (!isOpen() && CLOSE_DELAY >= 0) {
System.out.println("space 1");
controller.open();
isTimerEnabled = true;
t2.schedule(new TimerTask() {
public void run() {
controller.close();
t2.cancel();
}
}, CLOSE_DELAY);
}
// now all cases for the door being closed is handled.
// if the door is open, while the timer is enabled (timer running)
// we disable the timer and keep the door open.
else if (isOpen() && isTimerEnabled) {
System.out.println("space 2");
try{
t2.cancel();
}
catch(Exception e){
System.out.print("catch");
}
//t.purge();
// door should still be open. do not need to re-open
controller.open();
isTimerEnabled = false;
}
// if the door is open, while the timer is disabled (open forever)
// we just close the door
// then reset the timer for the next press
else if (isOpen() && !isTimerEnabled) {
System.out.println("space 3");
controller.close();
isTimerEnabled = true;
}
}
答案 0 :(得分:0)
你需要让“t2”成为一个类变量,然后你需要在调用日程表之前创建一个新的计时器。
t2 = new Timer();
t2.schedule(new TimerTask() {
public void run() {
controller.close();
t2.cancel();
}
}, CLOSE_DELAY);