Периодические запросы на работу пропускаются с WorkManager в Andorid - PullRequest
0 голосов
/ 10 октября 2019

Я реализовал некоторую повторяющуюся задачу, используя WorkManager, и она прекрасно работает (запускает мой код каждый период с несколькими минутами раньше или позже) в дневное время, когда я активно использую свой телефон. В ночное время он пропускает много периодов, и мне интересно, почему это происходит и как это решить.

fun startService() {
    val constraintsBuilder = Constraints.Builder()
    constraintsBuilder.setRequiredNetworkType(NetworkType.CONNECTED)
    val constraints = constraintsBuilder.build()

    val work = PeriodicWorkRequest.Builder(
        HttpWorker::class.java,
        40, TimeUnit.MINUTES,
        15, TimeUnit.MINUTES
    ).setConstraints(constraints)
        .addTag("TAG_WORKER")
        .build()

    WorkManager.getInstance().enqueueUniquePeriodicWork(
        HttpWorker::class.java.simpleName,
        ExistingPeriodicWorkPolicy.REPLACE,
        work
    )
}

Результат выглядит так:

---> run09: 14

---> прогон 09:54 (40 мин)

---> прогон 10:33 (39 мин)

---> прогон 11:53 (80 минут)

---> пробег 12:33 (39 минут)

...

---> пробег 00:35

---> прогон 01:20 (45 мин)

---> прогон 03:39 (139 мин) !!!

---> прогон 07:14 (215 мин) !!!

---> пробежка 07:47 (30 мин)

---> пробежка 08:26 (39 мин)

...

Определенно это связано с активностью устройства, также обратите внимание, что я отключил энергосбережение для своего приложения (мое устройство - новая модель Samsung Galaxy от 2018 Android 9.0). Что я должен сделать, чтобы игнорировать эти многочисленные пропущенные периоды в ночное время (когда устройство вообще не используется).

ps мое приложение отсутствует в Google Play, так что никаких проблем с взломами нет (но безкорень)

1 Ответ

0 голосов
/ 12 октября 2019

Согласно документации

setRequiresDeviceIdle

public Constraints.Builder setRequiresDeviceIdle (boolean requireDeviceIdle) Устанавливает, должно ли устройство быть бездействующим для запуска WorkRequest. Значением по умолчанию является false.

true: если устройство должно бездействовать для выполнения работы

, таким образом, если вы добавите этоограничение. ваша работа будет работать ночью!

constraintsBuilder.setRequiresDeviceIdle(true)
...