我想每天将 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())
更新:
我忘记提到的一件事是,在我的 Worker 内部,我总是返回
Result.success()
.因此,如果工作因某种原因失败,WorkManager 将在下一次迭代中重试。
最佳答案
使用 enqueueUniquePeriodicWork()
时无需检查工作是否已入队.使用 Keep
如ExistingPeriodicWorkPolicy
, 将保证只有在没有其他具有相同 uniqueWorkName
的工作的情况下才会将工作排入队列已经安排好了。
也就是说,您可以将您的独特作品排入队列的通常位置是onCreate()
。在您的应用程序中回调。这将保证作业被安排。
请记住,PeriodicWorkRequest
如documentation 中所述,可能会随着时间的推移而滑倒。 .我在 talk 中对此进行了介绍(大约 24:25)我上个月提出了一个可能的解决方法。对 DailyWorkers 的支持应该会在下一个 alpha 版本中的 v2.1.x 中登陆。
关于android - 将UniquePeriodicWork 加入队列的最佳位置是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56129663/