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包含给定数据,我在哪里执行该检查?您也可以在
中执行此操作并将值放入成功
。。。