编辑WorkManager方法getWorkInfoByIdLiveData无法提供WorkInfo

4

我正在尝试使用WorkManager实例中存在的getWorkInfoByLiveData方法获取我的WorkerInfo。

val workInfo = workManager.getWorkInfoByIdLiveData(uuid).value

WorkInfo 一直是 null。同时,我正在主线程中调用此方法。

我检查该方法的场景如下:当用户发送一个网络请求但没有连接到互联网时,我会简单地向 WorkManager 注册一个 Work。过了一段时间,如果我尝试使用 UUID 获取 WorkerInfo,它将始终给我 null。

注意:当调用 getWorkInfoByLiveData 时,Worker 并没有立即执行。

我期望 WorkManager 给我带来 ENQUEUED 状态的 WorkInfo。

Edit 1: 还有一种情况是,我正在开发的应用程序类似于社交应用程序。现在,在注册了第一个 worker 后,假设用户不想看到特定用户的帖子,那么这就是我需要注册第二个 worker 的地方,因为这时用户无法连接到互联网。现在我需要做的是取消先前注册的 worker,并创建一个 Chain of workers,以不显示某个用户的帖子 beginWith,然后获取所有帖子。为了取消 worker,我检查前一个 worker 是否仍处于 Enqueued State,如果是则取消它并创建一个新的 worker 链。

以下是代码。

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

workInfo实例始终为空。

1个回答

2

注意: 只有在添加了活动观察者之后,Livedata才会计算该值。

getWorkInfoByIdLiveData() 返回一个 LiveData<WorkInfo>,需要观察它才能获取workInfo的值:

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

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

您可以查看WorkManager的实验室,了解它如何使用。

是的,我知道,但根据LiveData文档,getValue方法始终返回当前值。那么,当我将worker排队到WorManager上并且之后它需要给我带有UUID的WorkInfo时,你不觉得呢? - Ahsan Saeed
LiveData 是用于观察数据并将其分发给观察者的。只有在添加了活动观察者之后,它才会计算值。 - pfmaggi
这篇文章可以帮助理解以下主题:https://medium.com/androiddevelopers/unit-testing-livedata-and-other-common-observability-problems-bb477262eb04 - pfmaggi
现在,如果您查看文章,则可以看到对于此数据的单元测试 assertEquals(viewModel.liveData1.value, "foo") // Passes 即使没有活动观察者也会通过。这是因为getValue始终会给出最后一个值。 此外,对于我的情况,我也有一个活动观察者,但仍然无法获取该值。 - Ahsan Saeed
你能否贴出你应用程序中的更多代码?你在什么时候/地方观察到这个LiveData? - pfmaggi
更新了问题。 - Ahsan Saeed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接