如何在WorkManager中链接唯一的工作?

3
我刚发现独特工作,它显然是:

一个强大的概念,保证您在同一时间只有一个具有特定名称的工作实例。

然而,我不知道如何在这之后链接另一段工作。

val workRequest = OneTimeWorkRequestBuilder<MyWorker>().build()
val operation = workManager.enqueueUniqueWork(UNIQUE_WORK_NAME, ExistingWorkPolicy.REPLACE, workRequest)
// Can't do anything with operation and ensureUniqueWork doesn't take `workContinuation`

使用另一种结构,我不能使用“唯一工作”,但这个方法可行:
val workRequest = OneTimeWorkRequestBuilder<MyWorker>().build()
var workContinuation = workManager.beginWith(workRequest)

val workRequestTwo = OneTimeWorkRequestBuilder<MyWorkerTwo>().build()
workContinuation = workContinuation.then(work)

workContinuation.enqueue()
3个回答

3
你可以使用beginUniqueWork函数,它接受一系列顺序工作的列表,而不是调用.then。你实际上是将唯一工作名称赋予整个链(第三个参数),而不仅仅是单个工作。
val workRequestOne = ...
val workRequestTwo = ...
val workRequests = listOf(workRequestOne, workRequestTwo)
workManager.beginUniqueWork("Unique work name", ExistingWorkPolicy.REPLACE, workRequests).enqueue()

1
我认为我强烈不同意这个答案,你犯了一个重要的错误——传递给函数beginUniqueWork的工人列表是并行的,而不是顺序的。 - nick

2

我觉得被接受的答案是错误的,正如@nick的评论所指出的那样。正确的答案应该是

val workRequestOne = ...
val workRequestTwo = ...
workManager.beginUniqueWork("Unique work name", ExistingWorkPolicy.REPLACE, workRequestOne).then(workRequestTwo).enqueue()

0

接受的答案不会按顺序执行所有工作。要进行顺序执行,应该使用ExistingWorkPolicy.APPEND而不是像下面给出的ExistingWorkPolicy.REPLACE

val workRequestOne = ...
val workRequestTwo = ...
val workRequests = listOf(workRequestOne, workRequestTwo)
workManager.beginUniqueWork("Unique work name", ExistingWorkPolicy.APPEND, workRequests).enqueue()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接