在观察作为方法公开的 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 只更改了一次。