Android – Управление задачей с помощью Timer и TimerTask?

В настоящее время я пытаюсь настроить сканирование WiFi в приложении для Android, которое сканирует точки доступа WiFi каждые 30 секунд.

Я использовал 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 () тоже не работает.

Есть лучший способ сделать это? Или я что-то пропустил в classах Timer / TimerTask?

Вы можете подумать:

  • Изучение логического результата при вызове функции cancel() в вашей задаче, так как это должно указывать, будет ли ваш запрос успешным или неудачным
  • Попробуйте purge() или cancel() на TimerTask вместо TimerTask

Если вам не нужны Timer и TimerTask , вы всегда можете использовать postDelayed() (доступно для Handler и любого View ). Это Runnable запуск Runnable в streamе пользовательского интерфейса после задержки. Чтобы он повторялся, просто попросите его снова запланировать себя после выполнения периодической работы. Затем вы можете отслеживать булевский флаг, чтобы указать, когда этот процесс должен завершиться. Например:

 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 () отменяет таймер и все запланированные задачи. Если есть текущая работа, она не затрагивается. На этом таймере не может быть запланировано больше задач. Последующие вызовы ничего не делают. Это объясняет проблему.

Давайте будем гением компьютера.