enqueueUniquePeriodicWork 的最佳位置是什么?

What is the best place to enqueueUniquePeriodicWork?

我想每天将数据库与服务器数据同步一次,将工作入队的最佳位置是什么,所以每天只有 运行s 一次? WorkManager 似乎并不关心下一个入队调用是否在 repeatInterval 内。如果我将排队工作放在应用程序 class 中,并且如果该工作已完成,如果我关闭并打开应用程序,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())

更新:

有一件事我忘了提,在我的 Worker 里面我总是 return Result.success()。因此,如果工作由于某种原因失败,WorkManager 将在下一次迭代中重试。

使用enqueueUniquePeriodicWork()时不需要检查工作是否已经入队。将 Keep 用作 ExistingPeriodicWorkPolicy,将保证仅在没有其他已安排具有相同 uniqueWorkName 的工作时才将工作排队。

也就是说,您可以将您的独特工作排入队列的通常位置是应用程序中的 onCreate() 回调。这将保证作业被安排。

请记住,PeriodicWorkRequest 可能会随着时间的推移而下滑,如我在上个月提出的 documentation. I've covered this in a talk(大约 24:25)中所描述的那样。对 DailyWorkers 的支持应该会出现在 v2 中。1.x 在下一个 alpha 版本中。