如何在不使用WorkManager立即运行的情况下更改定期工作请求期间?

问题描述 投票:0回答:2
val request = PeriodicWorkRequestBuilder<FooWorker>(1, TimeUnit.DAYS).build()
WorkManager.getInstance().enqueueUniquePeriodicWork(
    "FOO",
    ExistingPeriodicWorkPolicy.REPLACE,
    request
)

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

如果我们改为ExistingPeriodicWorkPolicy.KEEP,即使是期间或工人被改变,我们也无法取代工作。

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

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

android kotlin android-workmanager
2个回答
3
投票

没有办法以干净的方式定期完成你想要的工作。

但是,绝对不需要使用定期工作本身。通过在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
}

通过这种设置,你的onCreate() Application可以安全地使用ExistingWorkPolicy.KEEP来避免重新安排工作,如果你已经排队等待排队,当排队工作开始时,下一个WorkRequest将排队等候适当的新时期。


1
投票

看起来有一种方法可以用enqueueUniquePeriodicWork替换现在的定期工作。

  val request = PeriodicWorkRequest.Builder(FooWorker::class.java, 1, TimeUnit.DAYS).build()
  WorkManager.getInstance()
  .enqueueUniquePeriodicWork(WORK_TAG, ExistingPeriodicWorkPolicy.REPLACE, request)

确保你通过ExistingPeriodicWorkPolicy而不是ExistingWorkPolicy

© www.soinside.com 2019 - 2024. All rights reserved.