Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么scheduleAtFixedRate(任务、延迟、周期)不能按计划工作?_Android_Timer_Scheduled Tasks_Android Wifi_Timertask - Fatal编程技术网

Android 为什么scheduleAtFixedRate(任务、延迟、周期)不能按计划工作?

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在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);

直接来自:

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

如果你对你的代码所知不多,你就不可能解释你所观察到的具体行为,但是上面可能就是发生的事情

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

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


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