Android - 使用Timer和TimerTask控制任务?

时间:2010-01-29 12:08:14

标签: android timer scheduled-tasks

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

我已经使用Timer和TimerTask以我需要的间隔正确运行扫描。

但是我希望能够在用户按下按钮时停止并开始扫描,我当前无法停止然后重新启动Timer和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();
 }

}

所以Timer和Task启动正常并且扫描每30秒发生一次但是我不能让它停止,我可以停止Timer但是任务仍然发生并且scanTask.cancel()似乎也不起作用。< / p>

有更好的方法吗?或者我在Timer / TimerTask类中遗漏了什么?

3 个答案:

答案 0 :(得分:27)

您可以考虑:

  • 检查您的任务上调用cancel()的布尔结果,因为它应指示您的请求是成功还是失败
  • purge()而不是cancel()
  • 上试试TimerTimerTask

如果您不一定需要TimerTimerTask,则可以始终使用postDelayed()(可在Handler和任何View上使用)。这将安排在延迟后在UI线程上执行Runnable。要让它重复出现,只需在完成定期工作后再安排一次。然后,您可以监视布尔标志以指示此进程何时结束。例如:

private Runnable onEverySecond=new Runnable() {
    public void run() {
        // do real work here

        if (!isPaused) {
            someLikelyWidget.postDelayed(onEverySecond, 1000);
        }
    }
};

答案 1 :(得分:6)

使用您的代码,而不是

scanTask.cancel();

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

t.cancel();

答案 2 :(得分:5)

Android文档说cancel()取消Timer和所有计划任务。如果当前正在运行的任务,则不会受到影响。此计时器不再安排任何任务。后续调用什么都不做。这解释了这个问题。