Несогласованное планирование заданий планировщиком заданий

Я использовал планировщик заданий для отправки уведомлений с любым интервалом времени, скажем, 4 минуты с регулярным интервалом, поэтому я использовал

setPeriodic(длительность * 60 * 1000); //длительность 4 минуты

но его непоследовательность сначала отправляет уведомление через 1 минуту или 2 минуты, затем 1 минуту, затем 4 минуты, затем 8 минут, также я думаю, что он кэширует предыдущую продолжительность, вот как я реализовал код:

    public static void Scheduler(Context context){

    ComponentName componentName = new 
              ComponentName(context, ClsJobService.class);

    JobInfo.Builder builder =  new JobInfo.Builder(0, componentName)

           .setPeriodic(duration * 60 * 1000);
    JobScheduler jobScheduler =  (JobScheduler) 
              context.getSystemService (Context.JOB_SCHEDULER_SERVICE);
    jobScheduler.schedule(builder.build());

}

person blackHawk    schedule 23.07.2017    source источник
comment
Какую версию Android вы используете?   -  person Victor Rattis    schedule 29.07.2017
comment
Леденец, Sony Xperia z1s   -  person blackHawk    schedule 29.07.2017


Ответы (3)


Вы запланировали задание с 4-минутным интервалом с помощью JobScheduler на Android L. Будучи запланированным как периодическое, это задание может выполняться только один раз в любое время в течение установленного вами интервала (начало: время, когда вы вызвали schedule(), конец: плюс 4 минуты). И он будет запускаться снова только после завершения интервала, который он выполнял, только в новом диапазоне... такое поведение будет продолжаться до тех пор, пока вы не отмените задание.

например: задание было запланировано на 4 минуты как периодическое, а через 1 минуту оно было выполнено; Это задание будет запущено снова через 3 минуты в соответствии с 4-минутным диапазоном. В новом диапазоне он может выполняться в любое время в течение 4 минут.

Если вы не хотите, чтобы это периодическое поведение JobScheduler, рассмотрите возможность использования службы AlarmManager, чтобы запланировать свое задание для запуска уведомления каждые 4 минуты и перепланировать его после запуска уведомления.

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

Ссылки на исходный код Android L:

person Victor Rattis    schedule 29.07.2017

Это работает так, как задумано. (и часть «силы» JobScheduler)

Из документов:

setPeriodic(): укажите, что это задание должно повторяться с заданным интервалом и гибким. Задание может выполняться в любое время в окне гибкой длины в конце периода.

person Yossi Segev    schedule 23.07.2017

Почему бы вам не использовать Timertask для того же?

https://developer.android.com/reference/java/util/TimerTask.html

person GAGAN BHATIA    schedule 23.07.2017
comment
Это не дало бы правильных гарантий на Android. Например, JobScheduler запускает ваше задание, даже если ваше приложение в данный момент не запущено. - person Vlad; 03.04.2018