我想在活动开始时从API加载数据。目前,我从活动中调用视图模型的方法来加载数据,并且可以正常工作,但是我不知道这是否是最好的方法:
class MyViewModel : ViewModel() {
val myData = MutableLiveData<MyData>()
suspend fun loadData() = withContext(Dispatchers.IO) {
val data = api.getData()
withContext(Dispatchers.Main) {
myData.value = data
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
//initialize stuff...
viewModel.myData().observe(this) {
//do things with the data
}
}
我已经看到一些使用延迟初始化的示例,但是我不知道如何使用协程实现它。我已经尝试过了:
private val myData : MutableLiveData<MyData> by lazy {
MutableLiveData<MyData>().also {
viewModelScope.launch {
loadData()
}
}
}
fun myData() = myData
suspend fun loadData() = // same as above
y.decode('utf-8')
但是没有获取数据,什么也不显示。
答案 0 :(得分:1)
如果添加了依赖项livedata-ktx,则可以使用livedata构建器在同一块中发出API调用并发出。查看如何操作:
class MyViewModel : ViewModel() {
val myData: LiveData<MyData> = liveData {
val data = api.getData() // suspended call
emit(data) // emit data once available
}
}