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

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

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

不过,我希望能够停止和开始扫描时,用户按下button,我目前无法停止,然后重新启动计时器和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文档说,取消()取消计时器和所有计划的任务。 如果有当前正在运行的任务,则不受影响。 此定时器上不能再安排更多任务。 随后的呼叫什么都不做。 这解释了这个问题。