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

3

我需要在安卓应用中使用timertask设置定时器,每分钟检查wifi状态。我需要检查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个回答

1
直接从Android关于Timer的文档中引用:
使用固定速率执行时,任务的每次连续运行的开始时间都会被安排,而不考虑上一次运行发生的时间。如果延迟阻止计时器按时启动任务,则可能会导致一系列挤在一起的运行(一个立即启动另一个),这可能是正在发生的情况。
如果没有贴出更多代码,就无法解释您观察到的具体行为,但以上可能是正在发生的情况。
您可能希望使用固定周期调度,根据文档,这种调度方式更像是您想要的:
使用默认的固定周期执行时,每个任务的连续运行都相对于前一个运行的开始时间进行安排,因此两个运行之间的时间不会比指定的时间段更短。

好的,谢谢。我已经在编辑后的问题中发布了我的示例代码。 - vidulaJ
@Droidy - 我不确定发生了什么,但我猜测当无线电第一次关闭时,检查网络可用性和/或连接需要很长时间(可能等待超时)。然后,由于延迟,所有后续检查都会像文档描述的那样被捆绑在一起。尝试使用schedule而不是scheduleAtFixedRate,运行应该按照更规律的时间表执行,而不受延迟的影响。 - Ted Hopp
我也尝试过调度,但情况仍然相同。只有在关闭wifi无线电时才会发生这种情况。如果wifi无线电一直开着,它就可以正常工作。 - vidulaJ
你确定只有这个定时任务在更频繁地运行吗?如果你调用的是schedule()而不是scheduleAtFixedRate(),我看不出它怎么可能会更频繁。 (请注意,第二个任务将在第一个任务_开始_后一分钟启动,而不是在第一个任务完成后一分钟启动,因此不均匀的执行时间可能会使其_看起来_运行得更快,但这不应该是稳态条件。)你说它“似乎”更快了;你是如何确定它运行得有多快的? - Ted Hopp
我为某些情况设置了一些提示消息,当事情似乎更快时。我想我明白了这个,Tedd。是的,这是任务的开始时间。谢谢你的帮助。 - vidulaJ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接