Соблюдайте только один WorkRequest в цепочке продолжений работы. - PullRequest
0 голосов
/ 07 октября 2019

У меня есть набор связанных рабочих запросов, и я хочу наблюдать только первый из них.

Я получаю 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(", "))
        }
    })

Ответы [ 2 ]

0 голосов
/ 15 октября 2019

Если вы хотите наблюдать только первый запрос, вместо использования continuation.getWorkInfosLiveData(), вы можете просто использовать https://developer.android.com/reference/androidx/work/WorkManager.html#getWorkInfoByIdLiveData(java.util.UUID), и, таким образом, ваш код изменится на:

WorkManager.getInstance(context)
    .getWorkInfosByIdLiveData(syncRequest.id)
    .observe(...)
0 голосов
/ 08 октября 2019

Это работает как задумано. Если вам нужно получить 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 { ... })
...