Невозможно остановить / обновить обработчик (removeCallbacksAndMessages) - PullRequest
0 голосов
/ 29 февраля 2020

Я реализовал сервис, который циклически обновляет пользовательский интерфейс с произвольным интервалом. При изменении интервала обновления я хочу остановить текущий обработчик и начать заново с новым интервалом. Как я уже читал в других темах, невозможно прервать обработчик после его запуска. Однако упомянутые решения, такие как удаление обратных вызовов и сообщений

        handler.removeCallbacksAndMessages(null);
        handler.removeCallbacks(runnable);

, такие как реализация переключателя уничтожения

   started = false;
   if(started) {
      //do work..
   }

, не помогли вообще. Когда я перезагружаю свою службу с обновленным интервалом, обработчики не останавливаются, вызывая одновременное выполнение нескольких обработчиков.

Кто-то знает, что я делаю неправильно или как исправить ситуацию? Цени любую помощь! Спасибо!

//Mainactivity
  startService(new Intent(this, updateService.class));


public class updateService extends IntentService {

    private boolean started = false;
    private Handler handler = new Handler();


    public updateService() {
        super("updateService");
    }

    @Override
    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
            // Try to stop handler when startservice is called and start new one afterwards 
            stop();
            start();
        return super.onStartCommand(intent, flags, startId);
    }

    public void start() {
        started = true; // Didn't help

        int timer = config_store.getPreference("refresh_interval"));
        if (timer !=0){
            handler.postDelayed(runnable, timer);
        }
        else {
            stop();
        }

    }

 public void stop() {

        started = false;
        handler.removeCallbacksAndMessages(null); // Didn't help
        handler.removeCallbacks(runnable);  // Didn't help
    }

 private Runnable runnable = new Runnable() {
        @Override
        public void run() {
            if(started) {  // Didn't help.
                // Update job
                doJob();

                // Start over again
                start();
            }
        }
    };

}

1 Ответ

0 голосов
/ 01 марта 2020

Хорошо, исправил это сам: отложенный обработчик не был лучшим решением для циклического вызова методов. Теперь с помощью TimerTask:

  public int onStartCommand(@Nullable Intent intent, int flags, int startId) {

        if(mTimer != null) {
            mTimer.cancel();
        }
        mTimer = new Timer();

        int timer = Integer.parseInt(getPreference("refresh_interval")) * 1000;
        mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), timer, timer);
        return super.onStartCommand(intent, flags, startId);
    }

    class TimeDisplayTimerTask extends TimerTask {

        @Override
        public void run() {
            // run on another thread
            mHandler.post(new Runnable() {

                @Override
                public void run() {
                   // Do job
                }
            });
        }   
}
...