Подтвердить что ты не робот

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(), похоже, тоже не работает.

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

используя ваш код вместо

scanTask.cancel();

правильный способ - отменить ваш таймер (не timerTask):

t.cancel();

Ответ 3

В документации на Android указано, что cancel() отменяет таймер и все запланированные задачи. Если есть текущая работа, она не затрагивается. На этом таймере не может быть запланировано больше задач. Последующие вызовы ничего не делают. Это объясняет проблему.