在连锁工作连续中仅观察一个WorkRequest

时间:2019-10-07 16:07:04

标签: android android-livedata android-jetpack android-workmanager

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

我使用唯一分配给第一个请求的唯一标签来获得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(", "))
        }
    })

2 个答案:

答案 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(...)