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

В настоящее время я пытаюсь настроить сканирование WiFi в своем приложении для 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();
 }

}

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

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


person Donal Rafferty    schedule 29.01.2010    source источник


Ответы (3)


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

  • Изучение логического результата от вызова 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);
        }
    }
};
person CommonsWare    schedule 29.01.2010
comment
Я попытался проверить логическое значение в scanTask следующим образом: логическое значение tf = scanTask.cancel(); Но теперь я получаю исключение Null Pointer Exception в этой строке. Однако сама задача выполняется нормально ?? В конечном итоге я буду запускать код в службе, поэтому будет ли вариант использования postDelayed? - person Donal Rafferty; 29.01.2010
comment
Очевидно, что scanTask сбрасывается в null, и по приведенным вами фрагментам кода нельзя сказать, почему и как. postDelayed() не вариант в Service, но неясно, зачем вам нужен/нужен Service в этом случае. - person CommonsWare; 29.01.2010
comment
scanTask не используется больше нигде в коде всего приложения, как и Timer, то, что я опубликовал, — это полное использование Timer t и TimerTask scanTask. Я хочу создать приложение с минимальным пользовательским интерфейсом или вообще без него, поэтому, прочитав об Android, сервис - это способ сделать это? - person Donal Rafferty; 29.01.2010
comment
Та же проблема для меня, и я пробовал отмену и очистку для таймера. Если я выхожу со страницы (назад или домой), я отменяю в onPause и onStop. Поток работает в течение оставшегося времени — я не могу отменить таймер или прервать поток?! Это не ведет себя так, как задокументировано, если только мой код (похожий на этот) неверен. - person mobibob; 30.12.2010
comment
в качестве таймера верхней остановки нужно ли использовать и очистку, и отмену, или либо очистку, либо отмену? - person LiangWang; 30.05.2015

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

scanTask.cancel();

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

t.cancel();
person tony gil    schedule 29.07.2012

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

person Mike    schedule 03.03.2011