我想每天一次将db与服务器数据同步,什么是使工作入队的最佳位置,所以它每天只运行一次? 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将在下一次迭代中重试。
答案 0 :(得分:1)
使用enqueueUniquePeriodicWork()
时,您无需检查工作是否已入队。将Keep
用作ExistingPeriodicWorkPolicy
,将确保只有在没有其他工作已排定相同的uniqueWorkName
的情况下才入队。
说,通常可以在您的应用中排队独特工作的地方是应用程序中的onCreate()
回调。这样可以保证作业已安排好。
请记住,PeriodicWorkRequest
会随着时间的流逝而滑动,如documentation中所述。我在上个月介绍的talk中介绍了一种可能的解决方法。在接下来的一个Alpha版本中,应该在2.1.x版中提供对DailyWorkers的支持。