带有协程的 LiveData 延迟初始化不工作
LiveData lazy init with coroutines not working
我想在 activity 启动时从 API 加载数据。目前,我从 activity 调用视图模型的方法来加载数据,它工作正常,但我不知道这是否是最好的方法:
Activity
override fun onCreate(savedInstanceState: Bundle?) {
//initialize stuff...
viewModel.myData.observe(this) {
//do things with the data
}
lifeCycleScope.launch { viewModel.loadData() }
}
视图模型
class MyViewModel : ViewModel() {
val myData = MutableLiveData<MyData>()
suspend fun loadData() = withContext(Dispatchers.IO) {
val data = api.getData()
withContext(Dispatchers.Main) {
myData.value = data
}
}
}
我看过一些使用惰性初始化的例子,但我不知道如何用协程来实现它。我试过这个:
Activity
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
但是没有获取数据,也没有显示任何内容。
如果您添加了依赖项 livedata-ktx,那么您可以使用 livedata 构建器在同一个块中调用 API 并发出。查看如何操作:
class MyViewModel : ViewModel() {
val myData: LiveData<MyData> = liveData {
val data = api.getData() // suspended call
emit(data) // emit data once available
}
}
我想在 activity 启动时从 API 加载数据。目前,我从 activity 调用视图模型的方法来加载数据,它工作正常,但我不知道这是否是最好的方法:
Activity
override fun onCreate(savedInstanceState: Bundle?) {
//initialize stuff...
viewModel.myData.observe(this) {
//do things with the data
}
lifeCycleScope.launch { viewModel.loadData() }
}
视图模型
class MyViewModel : ViewModel() {
val myData = MutableLiveData<MyData>()
suspend fun loadData() = withContext(Dispatchers.IO) {
val data = api.getData()
withContext(Dispatchers.Main) {
myData.value = data
}
}
}
我看过一些使用惰性初始化的例子,但我不知道如何用协程来实现它。我试过这个:
Activity
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
但是没有获取数据,也没有显示任何内容。
如果您添加了依赖项 livedata-ktx,那么您可以使用 livedata 构建器在同一个块中调用 API 并发出。查看如何操作:
class MyViewModel : ViewModel() {
val myData: LiveData<MyData> = liveData {
val data = api.getData() // suspended call
emit(data) // emit data once available
}
}