保持运行独特的工作,而不是开始新的工作

时间:2019-07-11 09:12:09

标签: android android-workmanager

如果一个独特的作品处于运行状态,我希望保留它,而不是开始另一个独特的作品。

我认为ExistingWorkPolicy.KEEP将为我实现目标,但似乎如果已经有一个处于运行状态且未挂起的唯一工作,它将启动该唯一标签的另一工作。

摘自ExistingWorkPolicy.KEEP的文档:

  

如果存在具有相同唯一性的待处理(未完成)工作   名字,什么都不做。

我们知道,只有当它们处于挂起状态而不是运行状态时,它才能保持正常工作。

我使用的是最近发布的最新版本的AndroidX WorkManagerhttps://developer.android.com/jetpack/androidx/releases/work#2.1.0-rc01

编辑: 我已将问题提交给Google小组,您可以在此处进行跟进: https://issuetracker.google.com/issues/137210601

Edit2:安排独特作品的示例:

    val workRequest = OneTimeWorkRequest.Builder(TestWorker::class.java).build()
    WorkManager.getInstance(this).enqueueUniqueWork("my_worker", ExistingWorkPolicy.KEEP, workRequest)

编辑3: 经过更多测试后,我似乎错了,声称另一个工作程序在前一个工作程序运行时启动。之所以出现错误,是因为先前的工作人员在ENQUEUED之后进入RUNNING状态是因为它被打断,然后又从头开始运行。

总结起来,ExistingWorkPolicy.KEEP可以按预期工作,并确保仅运行一项唯一的工作。

2 个答案:

答案 0 :(得分:1)

ExistingWorkPolicy.KEEP表示,如果已经有一个WorkRequest处于相同的uniqueWorkName且处于未完成状态,WorkManager将简单地忽略新请求,并< strong>保持上一个。

完成是什么意思?
isFinished()函数所示,WorkRequest处于以下状态之一时即完成:SUCCEEDEDFAILEDCANCELLED

此演示文稿中有一些状态图可用: Embracing WorkManager

这是OneTimeWorker的一个 enter image description here

这是PeriodicWorker的那个 enter image description here

答案 1 :(得分:0)

如果KEEP策略仅适用于待处理的工作,则可以在安排新工作之前检查工作是否已经完成。

WorkManager.getInstance()
  .getStatusById(request.id)
  .observe(this@MainActivity, Observer {
    it?.let {
        val workerResult = it.outputData     
        if (it.state.isFinished) {
           Toast.makeText(this, "Work completed.", Toast.LENGTH_LONG)
           .show()
           //Schedule the job again
        } else {
           Toast.makeText(this, "Work not completed", Toast.LENGTH_LONG)
           .show()
           //Do Nothing
        }
    }
})