我面临的是观察作为方法公开的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)
}
}
您可以看到,唯一的区别是外部可以观察到汽车颜色。首先作为方法getCarColors()
,然后作为公共变量carColors
。
在xml数据绑定布局中,片段和几次都观察到并使用了汽车颜色。
使用可变方法时,一切正常。一旦API调用成功,代码就会一次从数据库请求汽车颜色。
使用方法方法时,API调用执行一次,但对其上的转换最多调用20次!为什么会这样呢?
要清楚:两个代码示例都以工作结果结尾,但是由于某种原因,第二个示例多次执行/调用,尽管转换后的apiCall仅更改了一次。
当您将其用作方法时,每次尝试访问该方法时,都会分别调用该方法。每次调用getCarColors()
时,它将执行您编写的功能。
当用作变量时,该代码仅在第一次执行-这称为变量初始化。变量初始化后,其值将存储在内存中,因此用于初始化的函数仅被调用一次。