Periodi c timertask выполняется несколько раз сразу после того, как Android возвращается из сна - PullRequest
1 голос
/ 04 марта 2020

Я реализовал фоновый сервис для периодического обновления данных в моем приложении. Механизм работает хорошо, если мое android устройство включено, но вызывает проблемы, когда Android находится в спящем режиме:

Давайте представим, что служба работает каждые 15 минут, тогда Android переходит в спящий режим на 1 час и при повторном пробуждении услуга будет выполняться 4 раза за раз. Предпочтительный bahaviour будет запускать службу только один раз, если он пропустил 1 или более циклов из-за сна.

Чтобы периодически запускать свой код, я использую TimerTask:

public class updateService extends IntentService {

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

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

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

    class updateTask extends TimerTask {

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

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

Буду признателен за любые предложения, как сделать лучше. Спасибо!

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Вы используете Timer.scheduleAtFixedRate(TimerTask task, long delay, long period), который объясняет в документации:

Если выполнение задерживается по какой-либо причине (например, сбор мусора или другие фоновые операции), два или более быстрое выполнение будет выполнено, чтобы «наверстать упущенное».

Кажется, вы хотите использовать Timer.schedule(TimerTask task, long delay, long period) вместо этого, что говорит:

Если выполнение по какой-либо причине задерживается (например, сборка мусора или другие фоновые действия), последующие исполнения также будут задерживаться.

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

Если выполнение по какой-либо причине задерживается (например, сборка мусора или другие фоновые действия), последующие выполнения также будут задерживаться. Он прав

...