用Timer和TimerTask控制任务?

我目前正试图在我的Android应用程序中设置WiFi扫描,每隔30秒扫描一次WiFi接入点。

我使用了Timer和TimerTask来按照我需要的时间间隔正确地运行扫描。

但是,我希望能够停止并开始扫描,当用户按下一个按钮,我目前无法停止,然后重新启动计时器和TimerTask。

这是我的代码

TimerTask scanTask;
final Handler handler = new Handler();
Timer t = new Timer();

public void doWifiScan(){

scanTask = new TimerTask() {
        public void run() {
                handler.post(new Runnable() {
                        public void run() {
                         wifiManager.scan(context); 
                         Log.d("TIMER", "Timer set off");
                        }
               });
        }};


    t.schedule(scanTask, 300, 30000); 

 }

  public void stopScan(){

   if(scanTask!=null){
      Log.d("TIMER", "timer canceled");
      scanTask.cancel();
 }

}

所以计时器和任务开始正常,扫描每30秒发生一次,但我无法让它停止,我可以停止计时器,但任务仍然发生,scanTask.cancel()似乎也不工作。

有一个更好的方法吗? 或者我在Timer / TimerTask类中丢失了什么?


你可以考虑:

  • 检查任务调用cancel()的布尔结果,因为它应该指示您的请求是成功还是失败
  • 尝试purge()cancel() Timer而不是TimerTask
  • 如果你不一定需要TimerTimerTask ,你总是可以使用postDelayed() (在处理器和任何View上都可用)。 这将计划一个Runnable在延迟后在UI线程上执行。 为了让它重现,只需在完成您的周期性工作之后再次安排自己。 然后,您可以监视布尔标志来指示此过程何时结束。 例如:

    private Runnable onEverySecond=new Runnable() {
        public void run() {
            // do real work here
    
            if (!isPaused) {
                someLikelyWidget.postDelayed(onEverySecond, 1000);
            }
        }
    };
    

    使用你的代码,而不是

    scanTask.cancel();
    

    正确的方法是取消你的计时器(不timerTask):

    t.cancel();
    

    Android文档说明cancel()取消计时器和所有计划任务。 如果当前正在运行的任务不受影响。 此定时器上不能再安排更多任务。 随后的通话什么都不做。 这解释了这个问题。

    链接地址: http://www.djcxy.com/p/74901.html

    上一篇: Controlling a task with Timer and TimerTask?

    下一篇: How to stop the task scheduled in Java.util.Timer class