Я планирую повторяющееся задание с помощью диспетчера заданий 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);
Потратив столько времени на документацию stackoverflow и firebase, я не нашел никакого решения. Затем я просмотрел код диспетчера заданий 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 для значения параметра needReschedule в методе 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 третье условие (результат! = JobService.RESULT_FAIL_RETRY;) истинно на основе этого тройного условия needReschedule? RESULT_FAIL_RETRY : RESULT_SUCCESS
Пожалуйста, изучите этот вопрос и поправьте меня, если я ошибаюсь.