mad*_*dim 5 android android-jetpack android-workmanager
我想每天将数据库与服务器数据同步一次,将工作排入队列的最佳位置是什么,因此它每天只运行一次?WorkManager 似乎并不关心下一个入队调用是否在重复间隔内。如果我将排队工作放在 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())
Run Code Online (Sandbox Code Playgroud)
更新:
我忘记提及的一件事是,在我的 Worker 内部我总是返回Result.success()。因此,如果工作由于某种原因失败,WorkManager 将在下一次迭代中重试。
当您使用 时,您不需要检查工作是否已经入队enqueueUniquePeriodicWork()。使用Keepas ExistingPeriodicWorkPolicy,将保证只有在没有其他已uniqueWorkName安排的相同工作的情况下,该工作才会排队。
也就是说,您可以将独特的工作排入队列的通常位置是onCreate()应用程序中的回调。这将保证作业的安排。
请记住,PeriodicWorkRequest随着时间的推移,罐子会滑落,如文档中所述。我在上个月的一次演讲(大约 24:25)中对此进行了介绍,并提出了一个可能的解决方法。对 DailyWorkers 的支持应该会在下一个 alpha 版本之一的 v2.1.x 中实现。
| 归档时间: |
|
| 查看次数: |
1154 次 |
| 最近记录: |