Какое лучшее место, чтобы поставить в очередь UnicPeriodicWork? - PullRequest
0 голосов
/ 14 мая 2019

Я хочу синхронизировать БД с данными сервера один раз в день, и как лучше всего поставить работу в очередь, чтобы она выполнялась только один раз в день?WorkManager, похоже, не волнует, находится ли следующий вызов в очереди в repeatInterval.Если я помещаю работу по постановке в очередь в класс Application, и если эта работа завершена, WorkManager запустит ее снова, если я закрою и открою приложение.

Означает ли это, что мне всегда нужно проверять, поставлена ​​ли работа в очередь передзвонить WorkManager.enqueue()?

val workInfo = workManager.getWorkInfosForUniqueWork("UNIQUE_WORK_NAME").get()?.getOrNull(0)
if (workInfo?.state == WorkInfo.State.ENQUEUED) {
    // do nothing
    return
}

workManager.enqueueUniquePeriodicWork(
                "UNIQUE_WORK_NAME",
                ExistingPeriodicWorkPolicy.KEEP,
                PeriodicWorkRequestBuilder<SyncDbWorker>(
                        1,
                        TimeUnit.DAYS
                )
                .setConstraints(constraints)
                .build())

ОБНОВЛЕНИЕ:

Одна вещь, которую я забыл упомянуть, это то, что внутри моего работника я всегда возвращаю Result.success().Поэтому, если по какой-то причине работа не удалась, WorkManager попытается повторить ее на следующей итерации.

1 Ответ

1 голос
/ 15 мая 2019

При использовании enqueueUniquePeriodicWork() вам не нужно проверять, поставлена ​​ли работа в очередь. Использование Keep в качестве ExistingPeriodicWorkPolicy гарантирует, что работа ставится в очередь только в том случае, если другие запланированные работы с таким же uniqueWorkName не запланированы.

Сказал, что обычное место, где вы можете поставить свою уникальную работу в очередь, - это обратный вызов onCreate() в вашем приложении. Это будет гарантировать, что работа запланирована.

Имейте в виду, что PeriodicWorkRequest может проскальзывать со временем, как описано в документации . Я рассмотрел это в докладе , который я представил в прошлом месяце с возможным обходным путем. Предполагается, что поддержка DailyWorkers появится в v2.1.x в одном из следующих альфа-релизов.

...