我有一组链接的工作请求,我只想观察其中的第一个。
我使用唯一分配给第一个请求的唯一标签来获得LiveData
。在过滤器内部,我再次过滤List<WorkInfo>
作为worker标记。
尽管进行了所有过滤,但我还是收到了三个成功通知,即使该标记仅添加到了第一个请求,该通知仍然针对链中的每个成功工作请求。
我不确定这是错误还是预期的行为(标记已分配给链中的所有工作请求)。
有没有办法观察链条中的一个工作要求?
到目前为止,我的代码:
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(", "))
}
})
答案 0 :(得分:0)
这按预期工作。如果您只需要为一个WorkInfo
获取WorkRequest
,则可以通过其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 { ... })
答案 1 :(得分:0)
如果您只想观察第一个请求,而不是使用continuation.getWorkInfosLiveData()
,则可以只使用https://developer.android.com/reference/androidx/work/WorkManager.html#getWorkInfoByIdLiveData(java.util.UUID),因此您的代码将更改为:
WorkManager.getInstance(context)
.getWorkInfosByIdLiveData(syncRequest.id)
.observe(...)