如何更改定期工作请求期间而不使用 WorkManager 立即运行?

Jos*_*hua 8 android kotlin android-workmanager

val request = PeriodicWorkRequestBuilder<FooWorker>(1, TimeUnit.DAYS).build()
WorkManager.getInstance().enqueueUniquePeriodicWork(
    "FOO",
    ExistingPeriodicWorkPolicy.REPLACE,
    request
)
Run Code Online (Sandbox Code Playgroud)

上面的代码是在RANonCreateApplication,以确保该请求被排入队列。但是,这会导致一个问题,即FooWorker每次用户启动应用程序时都会运行,因为ExistingPeriodicWorkPolicy.REPLACE取消以前的工作并将新工作加入队列,导致它立即运行。

如果我们更改为ExistingPeriodicWorkPolicy.KEEP,即使期间或工作人员更改,我们也无法替换工作。

有没有办法在当前运行后替换请求?

例如,原始请求每天运行 1 次,新请求每小时运行 1 次。运行下一个原始请求后,将其替换为新请求。

ian*_*ake 6

没有办法以一种干净的方式通过定期工作来做你想做的事情。

但是,绝对不需要使用定期工作本身。通过在doWork方法结束时安排下一个 WorkRequest ,就在返回之前,可以轻松实现相同的结构Result.SUCCESS

fun doWork(): Result {
  reallyDoWork()
  // Now schedule the next "periodic" work
  val request = OneTimeWorkRequestBuilder<FooWorker>().build()
  WorkManager.getInstance().enqueueUniqueWork(
    "FOO",
    ExistingWorkPolicy.REPLACE,
    request
  )
  return Result.SUCCESS
}
Run Code Online (Sandbox Code Playgroud)

有了这个设置,您onCreate()Application可以放心地使用ExistingWorkPolicy.KEEP,以避免重新安排工作,如果你已经有了一个WorkRequest排队,并当排队工作大火,接下来WorkRequest会与相应的新的周期来排队。