【Android】使用LiveData KTX Builder让代码更简洁
16lz
2021-01-23
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类型的风险。
更多相关文章
- 链接器解析多重定义的全局变量
- android2.2资源文件详解4--menu文件夹下的菜单定义
- Android 自定义组件 方法篇
- android 自定义导航控件
- 自定义带倒影和偏转的超炫Gallery
- Android 自定义view画圆
- 自定义控件attrs文件里的属性
- Android之自定义ListView滚动条样式
- 自定义ProgressBar的样式失效