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

标签 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();
 }

}

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

有没有更好的方法来做到这一点?还是我在 Timer/TimerTask 类中遗漏了什么?

最佳答案

你可以考虑:

  • 检查对您的任务调用 cancel() 的 bool 结果,因为它应该指示您的请求是成功还是失败
  • Timer 上尝试 purge()cancel() 而不是 TimerTask

如果您不一定需要 TimerTimerTask,您始终可以使用 postDelayed()(可在 Handler 和任何 查看)。这将安排一个 Runnable 在延迟后在 UI 线程上执行。要让它再次发生,只需在完成定期工作后再次安排它自己。然后,您可以监视一个 bool 标志以指示此过程应何时结束。例如:

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

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

关于Android - 使用 Timer 和 TimerTask 控制任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2161750/

相关文章:

java - 在 Android 上执行 AsyncTask/发布 JSON

python - Kivy buildozer 在为 Android 打包时使用错误版本的 Kivy 和 KivyMD

android - AudioRecorder无法正确录制

swift - 倒计时计时器后 UIPickerView 不会在其他 ViewController 上更新

android - 通过命令行调用 JUnit 时如何使 takeScreenshot() 在 Robotium 上工作?

android - 如何获取屏幕分辨率包括软键盘的大小?

php - 将数据添加到数据库,一定时间后自动删除?

playframework - Play Framework : await-like functionality in Jobs

windows-8 - 如何通过任务计划程序在启动时运行 WinRT 应用程序?

java - 根据使用 spring-boot @Scheduled 注释的条件动态修改调度程序时间