Есть ли способ сделать периодические задачи с более короткой задержкой?
Я использую диспетчер заданий Firebase и программирую простую периодическую работу, которая должна выполняться каждую минуту или около того, когда есть подключение к Интернету. Я знаю, что задания не выполняются точно в срок, потому что они хотели улучшить время автономной работы и позволить другим приложениям работать, но задержка слишком велика. он может достигать 25 минут, что слишком долго по сравнению с требуемой 1 минутой. Есть ли способ, чтобы периодические задания выполнялись хотя бы каждые 3-5 минут?
Вот как я программирую периодическое задание:
FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(MainActivity.this));
Job myJob = dispatcher.newJobBuilder()
// the JobService that will be called
.setService(MyJobService.class)
// uniquely identifies the job
.setTag("my-unique-tag")
.setRecurring(true)
.setLifetime(Lifetime.FOREVER)
// start between 0 and 10 seconds from now
.setTrigger(Trigger.executionWindow(0, 10))
.setReplaceCurrent(true)
.setRetryStrategy(RetryStrategy.DEFAULT_LINEAR)
// constraints that need to be satisfied for the job to run
.setConstraints(
// only run on an unmetered network
Constraint.ON_UNMETERED_NETWORK
)
.build();
dispatcher.mustSchedule(myJob);
2 ответа
Если вы хотите, чтобы ваш MyJobService
чтобы бегать каждую минуту, нужно изменить это...
.setTrigger(Trigger.executionWindow(0, 10))
... к этому...
.setTrigger(Trigger.executionWindow(60, 60))
То, что вы имели раньше, рассказывало FirebaseJobDispatcher
запускать свою работу каждые 0-10 секунд. Вставив в окно 60,60
вы говорите, чтобы запускать вашу работу примерно каждые 60 секунд. Вы также можете изменить это на 55,65
или какой-то другой вариант, но я нашел 60,60
работает хорошо для меня.
У меня была та же проблема: моя работа была запланирована на 60-120 секунд, но между первым и вторым прогоном моей работы, где примерно 6 минут.
Я просто пропустил звонок jobFinished(JobParameters params, boolean needsReschedule)
сразу после последней строки последней функции, вызванной заданием. Добавление этого решило проблему в моем случае.
Надеюсь, это поможет.