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()
,都会执行你写的函数
当用作变量时,代码仅在第一次执行 - 这称为变量初始化。一个变量初始化后,它的值存储在内存中,所以你用来初始化的函数只被调用一次。
我在观察作为方法公开的 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()
,都会执行你写的函数
当用作变量时,代码仅在第一次执行 - 这称为变量初始化。一个变量初始化后,它的值存储在内存中,所以你用来初始化的函数只被调用一次。