使UniquePeriodicWork入队的最佳位置是什么?

时间:2019-05-14 11:43:43

标签: android android-jetpack android-workmanager

我想每天一次将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将在下一次迭代中重试。

1 个答案:

答案 0 :(得分:1)

使用enqueueUniquePeriodicWork()时,您无需检查工作是否已入队。将Keep用作ExistingPeriodicWorkPolicy,将确保只有在没有其他工作已排定相同的uniqueWorkName的情况下才入队。

说,通常可以在您的应用中排队独特工作的地方是应用程序中的onCreate()回调。这样可以保证作业已安排好。

请记住,PeriodicWorkRequest会随着时间的流逝而滑动,如documentation中所述。我在上个月介绍的talk中介绍了一种可能的解决方法。在接下来的一个Alpha版本中,应该在2.1.x版中提供对DailyWorkers的支持。