在链式工作延续中仅观察一个工作请求



我有一组链式的工作请求,我只想观察其中的第一个。

我使用仅分配给第一个请求的唯一标签来获取LiveData。在过滤器中,我再次过滤工作线程标记的List<WorkInfo>

尽管进行了所有筛选,但我还是收到了三个成功通知,一个用于链中的每个成功工作请求,即使标签仅添加到第一个请求中也是如此。

我不确定这是一个错误还是预期的行为(标签分配给链中的所有工作请求(。

有没有办法只观察链中的一个工作请求?

到目前为止我的代码:


val workerTag = "a randomly generated long string"
val syncRequest = OneTimeWorkRequestBuilder<SyncWorker>()
.setConstraints(syncConstraints)
.addTag(workerTag)
.build()
val followOnRequest = OneTimeWorkRequestBuilder<FollowOnWorker>()
.build()

val finalRequest = OneTimeWorkRequestBuilder<FinalWorker>()
.build()

WorkManager.getInstance(applicationContext)
.beginUniqueWork(WORK_ONE_TIME_SYNC, ExistingWorkPolicy.REPLACE, syncRequest)
.then(followOnRequest)
.then(finalRequest)
.enqueue()
WorkManager.getInstance(applicationContext)
.getWorkInfosByTagLiveData(workerTag)
.observe(this, Observer { workInfoList ->
val workInfo = workInfoList.find { it.tags.contains(workerTag) }
?: return@Observer
// THIS OBSERVER IS CALLED FOR ALL THE REQUESTS IN THE CHAIN ABOVE WITH ALL THE TAGS 
if (workInfo.state.isFinished) {
Timber.i(workInfo.tags.joinToString(", "))
}
})

如果你只想观察第一个请求,而不是使用continuation.getWorkInfosLiveData()你可以只使用 https://developer.android.com/reference/androidx/work/WorkManager.html#getWorkInfoByIdLiveData(java.util.UUID(,因此你的代码将更改为:

WorkManager.getInstance(context)
.getWorkInfosByIdLiveData(syncRequest.id)
.observe(...)

这正在按预期工作。 如果您只需要获取一个WorkRequestWorkInfo,您可以通过其id或以下方式执行此操作:

val continuation = WorkManager.getInstance(applicationContext)
.beginUniqueWork(WORK_ONE_TIME_SYNC, ExistingWorkPolicy.REPLACE, syncRequest)
continuation.then(followOnRequest)
.then(finalRequest)
.enqueue()
continuation.getWorkInfosLiveData()
.observe(this, Observer { ... })

最新更新