增量定时器

发布于 2024-09-03 00:29:55 字数 1498 浏览 3 评论 0原文

我目前正在使用 Timer 和 TimerTask 每 30 秒执行一些工作。

我的问题是,每次完成这项工作后,我想增加计时器的间隔时间。

例如,它在计时器触发之间间隔 30 秒,但我想在间隔中添加 10 秒,以便下次计时器在触发之前需要 40 秒。

这是我以前的代码:


  public void StartScanning() {

    scanTask = new TimerTask() {
        public void run() {
                handler.post(new Runnable() {
                        public void run() {

                            wifiManager.startScan();
                            scanCount++;            
                            if(SCAN_INTERVAL_TIME <= SCAN_MAX_INTERVAL){

                                SCAN_INTERVAL_TIME = SCAN_INTERVAL_TIME + SCAN_INCREASE_INTERVAL;
                                t.schedule(scanTask, 0, SCAN_INTERVAL_TIME);
                            }

                        }
               });
        }};
        Log.d("SCAN_INTERVAL_TIME ** ", "SCAN_INTERVAL_TIME ** = " + SCAN_INTERVAL_TIME);
        t.schedule(scanTask, 0, SCAN_INTERVAL_TIME);

}

重构的代码


@Override
public void StartScanning() {

        t.schedule(new ScanTask(),SCAN_INTERVAL_TIME);

}

class ScanTask extends TimerTask{

    @Override
    public void run() {
        wifiManager.startScan();
        scanCount++;   

        if(SCAN_INTERVAL_TIME < SCAN_MAX_INTERVAL)
        SCAN_INTERVAL_TIME = SCAN_INTERVAL_TIME + SCAN_INCREASE_INTERVAL;

        t.schedule(new ScanTask(), SCAN_INTERVAL_TIME);
    }


}

它现在可以工作,但是每次创建一个新的 ScanTask() 都是浪费吗?

I'm currently using a Timer and TimerTask to perform some work every 30 seconds.

My problem is that after each time I do this work I want to increment the interval time of the Timer.

So for example it starts off with 30 seconds between the timer firing but I want to add 10 seconds to the interval then so that the next time the Timer takes 40 seconds before it fires.

Here is my previous code:


  public void StartScanning() {

    scanTask = new TimerTask() {
        public void run() {
                handler.post(new Runnable() {
                        public void run() {

                            wifiManager.startScan();
                            scanCount++;            
                            if(SCAN_INTERVAL_TIME <= SCAN_MAX_INTERVAL){

                                SCAN_INTERVAL_TIME = SCAN_INTERVAL_TIME + SCAN_INCREASE_INTERVAL;
                                t.schedule(scanTask, 0, SCAN_INTERVAL_TIME);
                            }

                        }
               });
        }};
        Log.d("SCAN_INTERVAL_TIME ** ", "SCAN_INTERVAL_TIME ** = " + SCAN_INTERVAL_TIME);
        t.schedule(scanTask, 0, SCAN_INTERVAL_TIME);

}

REFACTORED CODE


@Override
public void StartScanning() {

        t.schedule(new ScanTask(),SCAN_INTERVAL_TIME);

}

class ScanTask extends TimerTask{

    @Override
    public void run() {
        wifiManager.startScan();
        scanCount++;   

        if(SCAN_INTERVAL_TIME < SCAN_MAX_INTERVAL)
        SCAN_INTERVAL_TIME = SCAN_INTERVAL_TIME + SCAN_INCREASE_INTERVAL;

        t.schedule(new ScanTask(), SCAN_INTERVAL_TIME);
    }


}

It works now but is creating a new ScanTask() every time wasteful?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

鸠书 2024-09-10 00:29:55

我的做法如下:

1) 将任务安排为单次执行,而不是重复执行

2) 在执行结束时(可能在finally块中),安排新的单次执行的任务,具有较长的延迟。请注意,您必须创建任务的新实例,否则计时器将发出错误消息 (IllegalStateException)。这意味着您不能再使用匿名内部类。

Here is how I would do it:

1) Schedule the task for a single execution rather than a repeated one

2) At the end of the execution (possibly in a finally block), schedule a new single execution of the task, with a longer delay. Note that you must create a new instance of the task, otherwise the timer will complain (IllegalStateException). That means that you can't use an anonymous inner class anymore.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文