如果一个独特的作品处于运行状态,我希望保留它,而不是开始另一个独特的作品。
我认为ExistingWorkPolicy.KEEP
将为我实现目标,但似乎如果已经有一个处于运行状态且未挂起的唯一工作,它将启动该唯一标签的另一工作。
摘自ExistingWorkPolicy.KEEP
的文档:
如果存在具有相同唯一性的待处理(未完成)工作 名字,什么都不做。
我们知道,只有当它们处于挂起状态而不是运行状态时,它才能保持正常工作。
我使用的是最近发布的最新版本的AndroidX WorkManager
:
https://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
可以按预期工作,并确保仅运行一项唯一的工作。
答案 0 :(得分:1)
ExistingWorkPolicy.KEEP
表示,如果已经有一个WorkRequest
处于相同的uniqueWorkName
且处于未完成状态,WorkManager将简单地忽略新请求,并< strong>保持上一个。
完成是什么意思?
如isFinished()
函数所示,WorkRequest
处于以下状态之一时即完成:SUCCEEDED
,FAILED
和CANCELLED
。>
此演示文稿中有一些状态图可用: Embracing WorkManager
答案 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
}
}
})