EditWorkManager метод getWorkInfoByIdLiveData не дает WorkInfo

Я пытаюсь получить свой WorkerInfo с помощью метода getWorkInfoByLiveData, который существует в экземпляре WorkManager.

val workInfo = workManager.getWorkInfoByIdLiveData(uuid).value

WorkInfo всегда имеет значение NULL. Кроме того, я вызываю этот метод из основного потока.

Сценарий того, как я проверяю этот метод. Я пытаюсь поставить своего рабочего в очередь, когда пользователь отправляет сетевой запрос, и если Интернет не подключен, я просто регистрирую работу в WorkManager. Через некоторое время, если я попытаюсь получить WorkerInfo с UUID, он всегда будет давать мне null.

Примечание. При вызове getWorkInfoByLiveData Worker в это время не выполняется.

Разве я не ожидаю, что WorkManager предоставит мне WorkInfo с состоянием ENQUEUED.

Редактировать 1. Итак, другой сценарий может быть таким: приложение, над которым я работаю, похоже на социальное приложение. Теперь, после регистрации первого рабочего, предположим, что пользователь не хочет видеть сообщения от определенного пользователя, поэтому мне нужно зарегистрировать второго рабочего, потому что Интернет пользователя в это время недоступен. Теперь мне нужно отменить ранее зарегистрированного рабочего, а затем создать цепочку рабочих, чтобы не отображать сообщение пользователя в beginWith, а затем затем получить все сообщения. . Теперь, чтобы отменить воркера, я проверяю, что если предыдущий воркер все еще находится в состоянии постановки в очередь, то отменяю его и создаю новую цепочку или воркеров.

Вот код.

fun Context.isWorkerRegistered(uuid: UUID?): Boolean {
   val id = uuid ?: return false
   val workerInfo = workManager.getWorkInfoByIdLiveData(id).value
   return workerInfo?.state == WorkInfo.State.ENQUEUED
}

Экземпляр workInfo всегда имеет значение NULL.


person Ahsan Saeed    schedule 28.01.2020    source источник


Ответы (1)


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

getWorkInfoByIdLiveData() возвращает LiveData<WorkInfo>, которое необходимо соблюдать, чтобы получить значение workInfo:

val status = workManager.getWorkInfoByIdLiveData(uuid)
                        .observe(this, Observer{ workInfo ->

    if (workInfo!=null){
        // ...
    }
}

вы можете взглянуть на кодовую таблицу WorkManager, чтобы посмотреть, как это можно использовать.

person pfmaggi    schedule 28.01.2020
comment
Да, я знаю это, но метод getValue всегда возвращает текущее значение в соответствии с документацией LiveData. Итак, вы не думаете, что когда я ставлю воркера в очередь на WorManager и после этого он должен передать мне WorkInfo с UUID. - person Ahsan Saeed; 29.01.2020
comment
LiveData отслеживает данные и передает их наблюдателям. Он не будет вычислять значение, пока не будет добавлен активный наблюдатель. - person pfmaggi; 29.01.2020
comment
Эта статья может быть полезна для понимания этой темы: medium.com/androiddevelopers/ - person pfmaggi; 29.01.2020
comment
Можете ли вы опубликовать еще немного кода, который есть в вашем приложении? когда / где вы наблюдаете эти живые данные? - person pfmaggi; 29.01.2020
comment
Обновил вопрос - person Ahsan Saeed; 31.01.2020