为啥 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的区别
ScheduledExecutorService中scheduleAtFixedRate方法的同步
Timer的schedule和scheduleAtFixedRate方法的区别解析