保留 运行 个独特的作品,而不是开始新的作品

Keep a running unique work instead of starting new one

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

我认为 ExistingWorkPolicy.KEEP 可以满足我的需求,但似乎如果已经有一个独特的作品处于 运行 状态且未挂起,它将开始另一个作品独特的标签。

来自 ExistingWorkPolicy.KEEP 的文档:

If there is existing pending (uncompleted) work with the same unique name, do nothing.

我们知道只有当作品处于挂起状态时才会保留作品,而不是 运行 状态。

我使用的是最近发布的最新版本的 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: 经过更多测试后,我似乎错了,声称另一个工人开始而前一个工人是 运行。出现这个错误是因为前一个worker在RUNNING之后进入ENQUEUED状态,因为它被打断了,然后从头开始又是运行。

总而言之,ExistingWorkPolicy.KEEP 按预期工作,并确保只有一个独特的作品是 运行。

如果 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
        }
    }
})

ExistingWorkPolicy.KEEP 意味着,如果在 NON FINISHED 状态下已经有一个具有相同 uniqueWorkNameWorkRequest,WorkManager 将简单地忽略新请求和 KEEP 之前的请求。

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

本演示文稿中提供了一些状态图: Embracing WorkManager

这是 OneTimeWorker 的

这是 PeriodicWorker 的