Android - Управление задачами с помощью Timer и TimerTask? - PullRequest
37 голосов
/ 29 января 2010

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

Я использовал 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();
 }

}

Таким образом, Timer и Task запускаются нормально, и сканирование происходит каждые 30 секунд, однако я не могу остановить его, я могу остановить Timer, но задача все еще происходит, и scanTask.cancel () тоже не работает. 1010 *

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

Ответы [ 3 ]

27 голосов
/ 29 января 2010

Вы можете рассмотреть:

  • Изучение логического результата от вызова 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);
        }
    }
};
6 голосов
/ 30 июля 2012

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

scanTask.cancel();

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

t.cancel();
5 голосов
/ 03 марта 2011

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

...