Android LiveData:作为方法或变量提供的LiveData之间的差异

问题描述 投票:0回答:1

我面临的是观察作为方法公开的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仅更改了一次。

android android-livedata android-architecture-components android-livedata-transformations
1个回答
0
投票

当您将其用作方法时,每次尝试访问该方法时,都会分别调用该方法。每次调用getCarColors()时,它将执行您编写的功能。

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

© www.soinside.com 2019 - 2024. All rights reserved.