Диспетчер заданий Firebase

Я создаю приложение, которому необходимо отправить запрос в API. Этот запрос необходимо отправлять каждые 2 минуты. Для этого я использую диспетчер заданий Firebase.

Проблема в том, что первый запрос отправляется вовремя, а следующие отправляются с большей задержкой: например.

  • первый запрос: отправлено через 2 минуты
  • второй запрос: отправлено через 2,3 минуты (вместо двух)
  • третий запрос: отправлено через 3,5 минуты (вместо двух)
  • четвертый запрос: отправлено через 5 минут (вместо двух)

Как вы понимаете, через сутки задержка составит 30 минут и даже больше ...

вот код, который я использовал для создания вакансии (в основном действии - onCreate)

        Job pingJob = mDispatcher.newJobBuilder()
            .setService(PingJob.class) // the job class to execute
            .setTag(PingJob.TAG) //tag - name of the job
            .setRecurring(true) // repeat
            .setTrigger(Trigger.executionWindow(60, 60*2))
            .setReplaceCurrent(false)
            .build();

    mDispatcher.mustSchedule(pingJob);

Вот класс PingJob (чтобы убедиться, что проблема не в том, что я делал в onStartJob, я только поместил журнал):

public class PingJob extends Job {
    public static final String TAG = "ping_job";

    @Override
    public boolean onStartJob(final JobParameters params) {
        Log.d("ping job", "just put a log to see when is executed");
        jobFinished(params, true);
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return false;
    }

}

Я использую Android-бокс с Android 6.0.1 (но мое приложение должно работать и на устройстве 4.3, поэтому я использую firebase вместо JobScheduler) и сервисы Google Play 11.5.09 (434).

У вас есть идеи, почему он это делает? а есть ли способ обойти эту проблему? Если нет, есть ли другой способ выполнять задание каждые 2 минуты?


person dev    schedule 03.10.2017    source источник


Ответы (1)


Вы не делаете ничего плохого. Это спроектированное ожидаемое поведение. FirebaseJobDispatcher использует механизм планирования внутри сервисов Google Play, который, вероятно, будет использовать JobScheduler Под капотом для Android 5.0 и выше. JobScheduler объединяет задачи из разных приложений в один, чтобы не выводить устройство из спящего режима слишком часто и экономить заряд батареи. Так что нет гарантии, что ваша задача будет выполняться ровно каждые 2 минуты. Если вам нужна такая точность, рассмотрите возможность использования AlarmManager, который не рекомендуется делать любые сетевые вызовы, так как это влияет на срок службы батареи.

Зачем вообще нужно так часто отправлять запросы? Подумайте о том, чтобы больше думать о том, что вы делаете. Возможно, лучше сохранить данные, которые вы отправляете на серверную часть, в базе данных или на диске. Затем вы можете отправлять его партиями каждые 30-60 минут или как вам удобно. Вы также можете использовать Firebase Cloud Messaging, чтобы отправить сообщение на устройство с запросом. для отправки данных на серверную часть, когда это необходимо.

person andrei_zaitcev    schedule 03.10.2017
comment
Во-первых, спасибо за ответ. это приложение для цифровых вывесок, поэтому мне нужно отправлять этот запрос каждые две минуты, потому что нам нужно знать, работает ли приложение / подключено ли приложение, чтобы облегчить поддержку, когда наши клиенты звонят нам. - person dev; 03.10.2017
comment
Тогда попробуйте AlarmManager и IntentService. Не идеально, но подойдет для вашего случая, если вы не заботитесь о батарее. - person andrei_zaitcev; 03.10.2017
comment
Хорошо, я попробую, батарея не проблема, это коробка, которая всегда подключена к электричеству. Большое спасибо - person dev; 03.10.2017
comment
Как я могу отметить ваш комментарий как решение? Или лучше отметить свой ответ как решение? - person dev; 04.10.2017
comment
@dev мой ответ уже содержит информацию о AlarmManager. Так что, если это сработает для вас, я думаю, что сам ответ должен быть отмечен как решение. - person andrei_zaitcev; 04.10.2017