lifecycle-livedata-ktx
中提供了通过Builder创建LiveData的方式, 可以方便的配合suspend函数的调用。
引入livedata-ktx
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.2.0-rc03"
不使用 LiveData Builder
ViewModel
// 定义MutableLiveData
val data = MutableLiveData<Repos>()
// 方法定义
fun getRepos() {
viewModelScope.launch {
try {
// 通过suspend函数 请求API
val repos = api.getRepos()
// 通过postValue更新livedata
data.postValue(repos)
}
catch (e: Exception) {
...
}
}
}
MainActivity
// 定义ViewModel
private val viewModel: ViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
...
// 调用ViewModel
viewModel.getRepos()
// 订阅livedata
viewModel.data.observe(this, Observer {
// 响应处理
})
}
使用 LiveData Builder
ViewModel
// LiveData Builder
val data: LiveData<Repos> = liveData {
try {
val repos = api.getRepos()
emit(repos) // 通过emit()更新livedata
}
catch (e: Exception) {
...
}
}
// fun getRepos() 不必定义getRepos()
MainActivity
// 定义viewModel
private val viewModel: ViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
...
// 订阅livedata
viewModel.data.observe(this, Observer {
// 响应处理
})
}
使用Builder后,可以在定义LiveData的同时实现更新逻辑,Activity中也不必再显式调用getRepo
,代码得到精简。那liveData { ... }
是什么时候执行的呢?答案是在livedata被observe的时候。
另外,以前必须定义MutableLiveData以方便setValue,使用Builder后无需再依赖MutableLiveData,降低了对外暴露Mutable类型的风险。