如何解决协程不起作用的LiveData惰性初始化 活动 ViewModel 活动 ViewModel
我想在活动开始时从API加载数据。目前,我从活动中调用视图模型的方法来加载数据,并且可以正常工作,但是我不知道这是否是最好的方法:
活动
class MyViewModel : ViewModel() {
val myData = MutableLiveData<MyData>()
suspend fun loadData() = withContext(Dispatchers.IO) {
val data = api.getData()
withContext(Dispatchers.Main) {
myData.value = data
}
}
}
ViewModel
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
ViewModel
y.decode('utf-8')
但是没有获取数据,什么也不显示。
解决方法
如果添加了依赖项livedata-ktx,则可以使用livedata构建器在同一块中发出API调用并发出。查看如何操作:
class MyViewModel : ViewModel() {
val myData: LiveData<MyData> = liveData {
val data = api.getData() // suspended call
emit(data) // emit data once available
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。