协程不起作用的LiveData惰性初始化

时间:2020-10-01 16:54:30

标签: android android-livedata android-architecture-components

我想在活动开始时从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')

但是没有获取数据,什么也不显示。

1 个答案:

答案 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
    }
}