android - 将UniquePeriodicWork 加入队列的最佳位置是什么?

标签 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())

更新:

我忘记提到的一件事是,在我的 Worker 内部,我总是返回 Result.success() .因此,如果工作因某种原因失败,WorkManager 将在下一次迭代中重试。

最佳答案

使用 enqueueUniquePeriodicWork() 时无需检查工作是否已入队.使用 KeepExistingPeriodicWorkPolicy , 将保证只有在没有其他具有相同 uniqueWorkName 的工作的情况下才会将工作排入队列已经安排好了。

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

请记住,PeriodicWorkRequestdocumentation 中所述,可能会随着时间的推移而滑倒。 .我在 talk 中对此进行了介绍(大约 24:25)我上个月提出了一个可能的解决方法。对 DailyWorkers 的支持应该会在下一个 alpha 版本中的 v2.1.x 中登陆。

关于android - 将UniquePeriodicWork 加入队列的最佳位置是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56129663/

相关文章:

android - 将依赖项迁移到 Android Jetpack

Android Oreo workmanager PeriodicWork 不工作

java - 如何在特定时间排队 WorkManager OneTimeWorkRequest

java - Android 中的 Facebook 好友生日

android - 如何在 Android 中使用导航 Controller 组件返回根 fragment 或层次结构的顶部?

android - 导航组件无法弹出以退出应用程序

android - 如何对 WorkManager Worker 进行单元测试

android - 我可以使用 phoneGap 部署到多平台吗?

java - 选择哪一个 - Android 1.5 还是 Android 2.2? (我是初学者)

android - 无法在 Unity 5.3.4 中使用 facebook sdk 和 google play 一起为 android 构建