Android 为什么scheduleAtFixedRate(任务、延迟、周期)不能按计划工作?
我将使用计时器使用timertask在android应用程序中每分钟检查wifi状态。在这里,我必须在每分钟后检查wifi收音机是否打开或关闭。如果wifi收音机关闭,我必须打开它,当wifi收音机打开时,计时器按计划正常工作。但是,当wifi收音机在开始时关闭或在应用程序运行时关闭时,计划的任务无法按计划工作,而且似乎工作得更快。我该怎么做才能解决这个问题Android 为什么scheduleAtFixedRate(任务、延迟、周期)不能按计划工作?,android,timer,scheduled-tasks,android-wifi,timertask,Android,Timer,Scheduled Tasks,Android Wifi,Timertask,我将使用计时器使用timertask在android应用程序中每分钟检查wifi状态。在这里,我必须在每分钟后检查wifi收音机是否打开或关闭。如果wifi收音机关闭,我必须打开它,当wifi收音机打开时,计时器按计划正常工作。但是,当wifi收音机在开始时关闭或在应用程序运行时关闭时,计划的任务无法按计划工作,而且似乎工作得更快。我该怎么做才能解决这个问题 TimerTask timerTask = new TimerTask() { @Override
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);
直接来自: 使用固定速率执行时,任务每次连续运行的开始时间都是计划的,而不考虑上一次运行的时间。如果延迟阻止计时器按时启动任务,这可能会导致一系列聚集运行(一个接一个地启动) 如果你对你的代码所知不多,你就不可能解释你所观察到的具体行为,但是上面可能就是发生的事情 您可能希望使用固定周期计划,根据文档,它的行为更像您想要的: 使用默认的固定周期执行,任务的每个连续运行都是相对于上一次运行的开始时间安排的,因此两次运行在时间上不会比指定周期更接近
好的,谢谢你,我已经在编辑的问题上发布了我的示例代码。@Droid-我不知道到底发生了什么,但我猜当收音机第一次关闭时,检查网络可用性和/或连接需要很长时间(可能等待超时)。然后,由于延迟,所有后续检查都按照文档描述的那样集中起来。尝试使用
schedule
而不是scheduleAtFixedRate
,运行应该按照更规则的计划执行,而不管延迟如何。我也尝试过schedule。但情况是一样的。仅当wifi收音机关闭时才会发生这种情况。如果wifi收音机一直处于打开状态,则工作正常。您确定这项计时器任务(仅此一项)的运行频率更高吗?如果您调用的是schedule()
,而不是scheduleAtFixedRate()
,我看不出这有什么可能。(请注意,第二个将在第一个启动后一分钟启动,而不是在其完成后一分钟启动,因此不均匀的执行时间可能会使其看起来运行得更快,但这不应是稳态条件。)您说它“似乎”更快;你是如何确定它运行的速度的?我有一些关于条件的吐司信息,在这些条件下,事情似乎更快了。我想我得到了这个泰德。是的,这是任务的开始时间。谢谢你的帮助。