Android LiveData:作为方法或作为变量提供的 LiveData 之间的区别

Android LiveData: Difference between LiveData provided as method or as variable

我在观察作为方法公开的 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() 然后作为 public 变量 carColors.

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

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

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

需要说明的是:两个代码示例最终都得到了有效的结果,但由于某种原因,第二个代码示例多次获得 executed/called,尽管转换后的 apiCall 仅更改了一次。

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

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