为什么scheduleAtFixedRate(任务,延迟,期间)不按计划工作?

时间:2014-04-09 05:55:23

标签: android timer scheduled-tasks android-wifi timertask

我将使用一个使用timertask的计时器来检查Android应用程序中每分钟后的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 个答案:

答案 0 :(得分:1)

直接来自the Android docs for Timer

  

使用固定费率执行时,将安排每次连续运行任务的开始时间,而不考虑上次运行的时间。如果延迟阻止计时器按时启动任务,这可能会导致一系列的聚合运行(一个紧接着一个启动)。

如果你不了解更多关于代码的内容,就不可能解释你所观察到的具体行为,但上面可能是正在发生的事情。

你可能想要使用固定期间调度,根据文档,它的行为更像你想要的那样:

  

使用默认的固定期间执行,每次连续运行的任务都是相对于上一次运行的开始时间进行安排的,因此两次运行的时间永远不会超过指定时间段。