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

我在观察作为方法公开的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)
    }
}

As you can see, the only difference is how carColors are observable by the outside. First as as method getCarColors() then as a public variable carColors.

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

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

使用方法方法时,API调用执行一次,但是对其上的转换最多调用20次!为什么会这样呢?

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

评论
  • 少心怡
    少心怡 回复

    When you use it as a method, the method is called separately each time you try to access it. Every time you call getCarColors(), it will execute the function you wrote.

    当用作变量时,代码仅在第一次执行-这称为变量初始化。变量初始化后,其值将存储在内存中,因此用于初始化的函数仅被调用一次。