#android #firebase #firebase-cloud-messaging #firebase-job-dispatcher #jobservice
#Android #firebase #firebase-облако-обмен сообщениями #firebase-job-dispatcher #служба заданий
Вопрос:
Я тестирую приложение, которое получает сообщения Firebase cloud data и обрабатывает их в службе заданий Firebase. Получение сообщений в FirebaseMessagingService происходит мгновенно и без проблем, но служба заданий Firebase иногда запускается с большой задержкой (5-10 минут), а иногда и вовсе не запускается. Метод dispatcher.schedule (MyJob) всегда выдает результат SCHEDULE_RESULT_SUCCESS. Это функциональность планирования заданий:
// For long-running tasks (10 seconds or more) use Firebase Job Dispatcher.
Bundle bundle = new Bundle();
bundle.putInt(WatchDogService.REQUEST_ID, request.ordinal());
bundle.putString(REQUEST_PARAM, parameter);
FirebaseJobDispatcher dispatcher =
new FirebaseJobDispatcher(new GooglePlayDriver(this));
Job myJob = dispatcher.newJobBuilder()
.setService(LongJobService.class)
.setTag("ua.ers.LongJobService")
.setTrigger(Trigger.NOW)
.setReplaceCurrent(true)
.setExtras(bundle)
.build();
int result = dispatcher.schedule(myJob);
Log.d(TAG, "Schedule result: " result);
Вот класс службы заданий Firebase:
public class LongJobService extends JobService {
private static final String TAG = "LongJobService";
@Override
public boolean onStartJob(final JobParameters jobParameters) {
Log.d(TAG, "LongJobService started");
return true;
}
@Override
public boolean onStopJob(JobParameters jobParameters) {
Log.d(TAG, "LongJobService stopped");
return false;
}
}
Скажите, пожалуйста, в чем может быть причина проблемы?
Ответ №1:
Согласно документации, это обычное поведение
Серверной части планировщика рекомендуется использовать значение WindowEnd в качестве сигнала о том, что задание должно быть запущено, но это не принудительное поведение.
Но для лучшего выполнения попробуйте
Trigger.executionWindow(0, 0)
вместо
Trigger.NOW
Таким образом, это будет выглядеть
Job myJob = dispatcher.newJobBuilder()
.setService(Service.class)
.setRecurring(true) // if task is periodic, else pass "false"
.setTrigger(Trigger.executionWindow(0, 0))
.setTag("tag")
.build();
Комментарии:
1. Спасибо за ваш ответ. Но почему вы предлагаете использовать .setRecurring(true)?
2. Ну, это была моя реализация, но если ваша задача периодическая, вы можете добавить это свойство. в противном случае просто передайте false.
3. Какое максимальное значение задержки запуска мы можем ожидать в вашем случае?
4. Какую задержку вы получали? У меня это заняло около 10-15 секунд после изменения кода, у остальных — 30-40 секунд
5. Спасибо. Это помогает мне.