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
如果你不一定需要Timer
和TimerTask
,你总是可以使用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文档说,取消()取消计时器和所有计划的任务。 如果有当前正在运行的任务,则不受影响。 此定时器上不能再安排更多任务。 随后的呼叫什么都不做。 这解释了这个问题。