保留 运行 个独特的作品,而不是开始新的作品
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 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:
经过更多测试后,我似乎错了,声称另一个工人开始而前一个工人是 运行。出现这个错误是因为前一个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 状态下已经有一个具有相同 uniqueWorkName
的 WorkRequest
,WorkManager 将简单地忽略新请求和 KEEP 之前的请求。
这是什么意思已完成?
如 isFinished()
函数所示,WorkRequest
在处于以下状态之一时完成:SUCCEEDED
、FAILED
和 CANCELLED
。
本演示文稿中提供了一些状态图:
Embracing WorkManager
这是 OneTimeWorker 的
这是 PeriodicWorker 的
对于处于 运行 状态的独特作品,我希望保留它而不是开始另一个独特作品。
我认为 ExistingWorkPolicy.KEEP
可以满足我的需求,但似乎如果已经有一个独特的作品处于 运行 状态且未挂起,它将开始另一个作品独特的标签。
来自 ExistingWorkPolicy.KEEP
的文档:
If there is existing pending (uncompleted) work with the same unique name, do nothing.
我们知道只有当作品处于挂起状态时才会保留作品,而不是 运行 状态。
我使用的是最近发布的最新版本的 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:
经过更多测试后,我似乎错了,声称另一个工人开始而前一个工人是 运行。出现这个错误是因为前一个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 状态下已经有一个具有相同 uniqueWorkName
的 WorkRequest
,WorkManager 将简单地忽略新请求和 KEEP 之前的请求。
这是什么意思已完成?
如 isFinished()
函数所示,WorkRequest
在处于以下状态之一时完成:SUCCEEDED
、FAILED
和 CANCELLED
。
本演示文稿中提供了一些状态图: Embracing WorkManager
这是 OneTimeWorker 的
这是 PeriodicWorker 的