每次按下按钮,我都会使用新的计时器运行一个功能;我不知道如何从之前的印刷机访问计时器

时间:2017-09-06 22:03:58

标签: java timer

我有一个功能按下(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;
        }
    }

1 个答案:

答案 0 :(得分:0)

你需要让“t2”成为一个类变量,然后你需要在调用日程表之前创建一个新的计时器。

t2 = new Timer();
t2.schedule(new TimerTask() {
            public void run() {
                controller.close();
                t2.cancel();
            }
        }, CLOSE_DELAY);