Android 具有异步数据加载和SavedStateHandle的ViewModel

Android 具有异步数据加载和SavedStateHandle的ViewModel,android,android-livedata,android-architecture-components,android-viewmodel,Android,Android Livedata,Android Architecture Components,Android Viewmodel,我是ViewModel新手,我正在尝试找出与从API异步加载数据一起使用savedstatehold的最佳实践 我的用例是,我的ViewModel数据应该从API加载一次,然后我希望SavedStateHandle保存该数据,这样如果我返回片段,它就不会再次执行该API调用。我只希望通过UI中的下拉刷新机制从API刷新数据,否则它应该使用savedstatehold数据 我发现了大量使用其中一种(异步数据加载或savedstatehold的示例,但并非两者都使用 这是我的初始代码,它不使用sav

我是
ViewModel
新手,我正在尝试找出与从API异步加载数据一起使用
savedstatehold
的最佳实践

我的用例是,我的
ViewModel
数据应该从API加载一次,然后我希望
SavedStateHandle
保存该数据,这样如果我返回片段,它就不会再次执行该API调用。我只希望通过UI中的下拉刷新机制从API刷新数据,否则它应该使用
savedstatehold
数据

我发现了大量使用其中一种(异步数据加载或
savedstatehold
的示例,但并非两者都使用

这是我的初始代码,它不使用
savedstatehold

class FilmsViewModel(private val savedStateHandle: SavedStateHandle): ViewModel() {
    private val filmsLiveData : MutableLiveData<List<Film>?> by lazy {
        MutableLiveData<List<Film>?>().also {
            loadFilms()
        }
    }

    fun getFilms(): LiveData<List<Film>?> {
        return filmsLiveData
    }

    fun loadFilms() {
        Log.d("FilmsViewModel", "loadFilms")
        StarWarsApiService.getFilms(object: FilmsCallback {
            override fun success(films: List<Film>?) {
                filmsLiveData.value = films
            }
        }, object: ErrorCallback {
            override fun error(error: ApiError) {
                // TODO
            }
        })
    }
}
类FilmsViewModel(private val savedstatehold:savedstatehold):ViewModel(){
私有val filmsLiveData:lazy提供的可变LiveData{
MutableLiveData()。同样{
电影(
}
}
fun getFilms():LiveData{
返回电影Slivedata
}
趣味电影(){
Log.d(“FilmsViewModel”、“loadFilms”)
StarWarsApiService.getFilms(对象:FilmsCallback{
超越乐趣成功(电影:列表?){
filmsLiveData.value=胶片
}
},对象:ErrorCallback{
覆盖乐趣错误(错误:APIRERROR){
//待办事项
}
})
}
}

有什么想法吗?

默认情况下,谷歌想要的方式(以及尝试重新获取onStart的方式)是让
StarWarsApiService.getFilms
成为
suspend fun
而不是基于回调,然后你就可以这样做了

class FilmsViewModel(private val savedStateHandle: SavedStateHandle): ViewModel() {
    val filmsLiveData = liveData {
        emit(loadFilms())
    }
}
但您要寻找的是一个常规的
viewModelScope.launch{
,它将检索到的数据保存在
MutableLiveData
中,或者保存到本地存储(房间)中,该存储(房间)将暴露片段将观察到的
LiveData


SavedStateHandle不是用于数据,而是用于状态。

以及如何“返回片段”?是什么阻止您检查savedstatehold是否包含给定数据?如果不是从API加载它?…我打赌savedstatehold不是您认为的那样…@Selvin这正是我感到困惑的地方。如果数据savedstatehold包含给定数据,我在哪里执行该检查?您也可以在
中执行此操作并将值放入
成功
。。。