Диспетчер заданий Firebase не работает
Я планирую повторяющуюся работу с помощью диспетчера заданий Firebase. Но это не выполняется.
Job job = builder.setService(FetchGCMNotificationService.class)
.setTag(FIREBASE_JOB_TAG)
.setRecurring(true)
.setLifetime(Lifetime.FOREVER)
.setReplaceCurrent(true)
.setConstraints(Constraint.ON_ANY_NETWORK)
.setTrigger(Trigger.executionWindow(TimeUnit.MINUTES.toSeconds(9),TimeUnit.MINUTES.toSeconds(10)))
.build();
firebaseJobDispatcher.mustSchedule(job);
После того, как я потратил так много времени на документооборот в стеке, я не нашел никакого решения. Затем я просмотрел код диспетчера заданий Firebase и было условие для перепланирования заданий. Условие находится в классе GooglePlayReceiver:
private static boolean needsToBeRescheduled(JobParameters job, int result) {
return job.isRecurring()
&& job.getTrigger() instanceof ContentUriTrigger
&& result != JobService.RESULT_FAIL_RETRY;
}
Согласно этому условию
- Работа должна быть повторяющейся, что верно в моем случае
- job.getTrigger() должен быть экземпляром ContentUriTrigger. Я запутался здесь, потому что я хочу выполнить свою работу на основе ExecutionWindowTrigger. Итак, как я могу дать ContentUriTrigger.
- И последнее условие верно в моем случае, потому что, когда моя работа завершается, я передаю значение false для значения параметра needsReschedule в методе jobFinished.
Реализация метода jobFinished в классе JobService:
public final void jobFinished(@NonNull JobParameters job, boolean needsReschedule) {
if (job == null) {
Log.e(TAG, "jobFinished called with a null JobParameters");
return;
}
synchronized (runningJobs) {
JobCallback jobCallback = runningJobs.remove(job.getTag());
if (jobCallback != null) {
jobCallback.sendResult(needsReschedule ? RESULT_FAIL_RETRY : RESULT_SUCCESS);
}
}}
Таким образом, в GooglePlayReceiver 3-е условие (результат!= JobService.RESULT_FAIL_RETRY;) выполняется в соответствии с этим троичным условием needsReschedule? RESULT_FAIL_RETRY: RESULT_SUCCESS
Пожалуйста, посмотрите на эту проблему и исправьте меня, если я ошибаюсь.