2

在观察作为方法公开的 LiveData 和作为变量公开的 LiveData 之间,我面临着一个奇怪但巨大的行为差异。在您的 ViewModel 中考虑以下代码:

LiveData 作为方法

private val carApiCall = carRepository.getCar(carId)

fun getCarColors() = Transformations.switchMap(carApiCall ) { resource ->
    when (resource.resourceStatus) {
        ResourceStatus.SUCCESS -> databaseRepository.getCarColors(carId)
    }
}

LiveData 作为变量

private val carApiCall = carRepository.getCar(carId)

val carColors = Transformations.switchMap(carApiCall ) { resource ->
    when (resource.resourceStatus) {
        ResourceStatus.SUCCESS -> databaseRepository.getCarColors(carId)
    }
}

如您所见,唯一的区别是 carColors 是如何被外部观察到的。首先作为方法,getCarColors()然后作为公共变量carColors

在 xml 数据绑定布局中,片段和几次都观察和使用汽车颜色。

使用可变方法时,一切正常。一旦 API 调用成功,代码就会从数据库中请求汽车颜色一次。

使用方法方式时,API调用执行一次,但其上的Transformation最多调用20次!为什么它会这样?

需要明确的是:两个代码示例最终都得到了工作结果,但由于某种原因,第二个示例被执行/调用了很多次,尽管转换后的 apiCall 只更改了一次。

4

1 回答 1

1

当您将它用作方法时,每次尝试访问它时都会单独调用该方法。每次调用时getCarColors(),它都会执行你编写的函数。

当用作变量时,代码仅在第一次执行 - 这称为变量初始化。一个变量被初始化后,它的值被存储在内存中,所以你用来初始化的函数只被调用一次。

于 2020-05-17T15:19:05.843 回答