【问题标题】:What is the best place to enqueueUniquePeriodicWork?将UniquePeriodicWork 加入队列的最佳位置是什么?
【发布时间】:2019-05-14 11:43:42
【问题描述】:

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

【问题讨论】:

  • 取决于用例,但如果你有一个单一的活动应用程序,请在那里使用它,否则。仅在您需要的活动中使用它。
  • @StavroXhardha 问题是它不属于任何活动,这项工作只需每天完成一次(即开即弃)

标签: android android-jetpack android-workmanager


【解决方案1】:

当您使用enqueueUniquePeriodicWork() 时,您不需要检查工作是否已经入队。将Keep 用作ExistingPeriodicWorkPolicy,将保证只有在没有其他具有相同uniqueWorkName 的工作的情况下才将工作排入队列。

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

请记住,PeriodicWorkRequest 可能会随着时间的推移而滑动,如documentation 中所述。我已经在 talk(大约 24:25)中介绍了这一点,我在上个月提出了一个可能的解决方法。对 DailyWorkers 的支持应该会在下一个 alpha 版本中的 v2.1.x 中实现。

【讨论】:

  • WorkManager.enqueueUniquePeriodicWork() 似乎无法以这种方式工作。有时它会忽略我杀死并重新启动应用程序的时间间隔,至少在我的模拟器上是这样。这是一个错误吗?
  • 我刚刚找到了我的问题的答案:issuetracker.google.com/issues/129654588#comment2
  • 目前 WorkManager 中没有什么新东西。 WorkManager 不支持确切的时间,并且延迟是相对的。要拥有一个真正的“日常工作者”,我们还需要考虑电话时区的变化,这不是我们正在努力的事情。如果您认为在库中具有此功能很重要,请提交功能请求:issuetracker.google.com/issues/…
  • 什么是DailyWorkers??
  • 我用DailyWorker这个词来表示一个Worker,它每天总是在同一时间执行一次(例如每天早上6:00执行的Worker)。
猜你喜欢
  • 1970-01-01
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多