Периодическое задание не выполняется последовательно при использовании библиотеки Evernote Android-Job

Я пытаюсь запланировать периодическое задание для запуска каждые 15 минут, используя android-job. Проблема в том, что задание запускается 2-3 раза, а затем не запускается каждые 15 минут. По сути, за 8 часов он запускался почти 10-11 раз, когда устройство простаивало. Есть ли что-то, что я делаю неправильно. Единственное требование, которое есть у моей работы, это то, что сеть должна быть подключена, которая была подключена.

Библиотека android-job несколько гарантирует, что задание будет запущено? Это мой код для работы

   public class TestNetworkJob extends Job {

    public static final String TAG = "TestNetworkJob";

    @NonNull
    @Override
    protected Result onRunJob(Params params) {
        Timber.i("onRunJob");

        RetrofitUtils.getInstance().postSlack("TestCall: " + DateTimeUtils.getLocalizedDateTimeString(System
                .currentTimeMillis()));
        return Result.SUCCESS;

    }

    public static JobRequest buildJobRequest() {
        return new JobRequest.Builder(TAG)
                .setUpdateCurrent(true)
                .setRequiredNetworkType(JobRequest.NetworkType.CONNECTED)
                .setPeriodic(TimeUnit.MINUTES.toMillis(15))
                .build();
    }
}

person NinjaCoder    schedule 18.11.2017    source источник
comment
Это похоже на типичное поведение режима Doze. Библиотека Evernote этому не препятствует.   -  person CommonsWare    schedule 19.11.2017
comment
Итак, как мы можем убедиться, что задание выполняется каждые 15 минут? Я думал, что в этом весь смысл использования API-интерфейсов планировщика заданий. @CommonsWare   -  person NinjaCoder    schedule 19.11.2017


Ответы (1)


По сути, за 8 часов он запускался почти 10-11 раз, когда устройство простаивало.

Это похоже на стандартное поведение режима Doze, с которым вы столкнетесь на устройствах Android 6.0+.

Я думал, что в этом весь смысл использования API-интерфейсов планировщика заданий.

О, $DEITY, нет. Смысл использования JobScheduler (или обертки вокруг него) заключается в том, чтобы быть дружественным к батарее.

Итак, как мы можем убедиться, что задание выполняется каждые 15 минут?

В общем, нет.

Google хочет, чтобы вы прекратили опрос и переключились на Firebase Cloud Messaging для push-сообщений на стороне сервера. Вы можете поэкспериментировать с setAndAllowWhileIdle()/setExactAndAllowWhileIdle() на AlarmManager. Но в целом война с фоновой обработкой означает, что выполнять периодическую фоновую работу в лучшем случае сложно.

person CommonsWare    schedule 18.11.2017