为啥 scheduleAtFixedRate(task, delay, period) 不能按计划工作?

Posted

技术标签:

【中文标题】为啥 scheduleAtFixedRate(task, delay, period) 不能按计划工作?【英文标题】:Why does scheduleAtFixedRate(task, delay, period) not work as scheduled?为什么 scheduleAtFixedRate(task, delay, period) 不能按计划工作? 【发布时间】:2014-05-22 03:35:01 【问题描述】:

我将使用 timertask 的计时器在 android 应用程序中每分钟检查一次 wifi 状态。在这里,我必须每分钟检查一次无线广播是否打开或关闭。如果 wifi 收音机关闭,我必须打开它,当 wifi 收音机打开时,计时器按计划正常工作。但是,当 wifi 无线电在开始时关闭或在应用程序运行时关闭时,计划任务无法按计划工作,并且似乎工作得更快。我应该怎么做才能解决这个问题?

      TimerTask timerTask = new TimerTask() 

            @Override
            public void run() 
                try 
                    ConnectivityManager connMgr = (ConnectivityManager) c.getSystemService(Context.CONNECTIVITY_SERVICE);

                    NetworkInfo networkInfo     = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

                    if(!networkInfo.isAvailable())                         
                        mainWifi.setWifiEnabled(true);
                    
                    else
                        // Wifi is available
                    

                    if(networkInfo.isConnected())
                        // Connected to a WiFi network.
                    
                
                catch(Exception e)

                
            
        ;
        timerT.scheduleAtFixedRate(timerTask, 0, 60000);

【问题讨论】:

【参考方案1】:

直接来自the Android docs for Timer

对于固定速率执行,任务的每次连续运行的开始时间都会被安排,而不考虑上一次运行发生的时间。如果延迟阻止计时器按时启动任务,这可能会导致一系列聚集运行(一个接一个地立即启动)。

如果不了解比您发布的代码更多的信息,就不可能解释您观察到的具体行为,但以上可能是正在发生的事情。

您可能希望使用固定周期调度,根据文档,它的行为更像您想要的:

使用默认的固定周期执行,任务的每次连续运行都是相对于前一次运行的开始时间安排的,因此两个运行永远不会在时间上比指定的周期更接近。

【讨论】:

好吧,谢谢你,我已经在编辑后的问题上发布了我的示例代码。 @Droidy - 我不知道到底发生了什么,但我的猜测是当收音机第一次关闭时,检查网络可用性和/或连接需要很长时间(可能等待超时)。然后,由于延迟,所有后续检查都按照文档描述进行了汇总。尝试使用schedule 而不是scheduleAtFixedRate,运行应该更规律地执行,无论延迟如何。 我也试过日程安排。但情况是一样的。仅当关闭 wifi 无线电时才会发生这种情况。如果 wifi 收音机一直打开,它工作正常。 您确定是这个定时器任务(而且只有这个)运行得更频繁?如果您调用schedule() 而不是scheduleAtFixedRate(),我看不出它会如何。 (请注意,第二个将在第一个开始后一分钟开始,而不是在它完成后一分钟,因此不均匀的执行时间可能使其看起来运行得更快,但这不应该是稳态条件。)您说它“似乎”更快;你如何确定它的运行速度? 我收到了一些关于条件的祝酒消息,其中事情似乎更快。我想我得到了这个泰德。是的,这是任务的开始时间。感谢您的帮助。

以上是关于为啥 scheduleAtFixedRate(task, delay, period) 不能按计划工作?的主要内容,如果未能解决你的问题,请参考以下文章

schedule和scheduleAtFixedRate的区别

更改计时器计划 scheduleAtFixedRate

ScheduledExecutorService中scheduleAtFixedRate方法的同步

Timer的schedule和scheduleAtFixedRate方法的区别解析

scheduleAtFixedRate 与 scheduleWithFixedDelay 的区别

scheduleAtFixedRate和scheduleWithFixedDelay探究