一、概念

| 概念 | 基于观察者模式,数据的变化会自动更新到UI。 |
| 通信 | View→ViewModel:View作为观察者,监听ViewModel中数据(LiveData、Flow)的变化从而自动更新UI。 ViewModel→Model:ViewModel调用Model获取数据。 ViewModel→View:ViewModel作为被观察者,当数据发生变化时,调用接口通知订阅者View更新。 |
| 解决 | MVP中接口泛滥的问题(写一大堆接口导致调用链增长、调试麻烦、类爆炸、包体积增大)、内存泄漏问题(Presenter持有具有生命周期的View实例问题)。 |
二、 搭建项目
2.1 Model 层
数据层详见:Repository 设计模式
2.2 VM 层
官方链接:JetPack ViewModel
Repository 通过构造传入 ViewModel 而不是使用单例(生命周期等于应用不利于回收)或直接在其内部创建实例(硬编码不利于解耦测试)。依赖项由外部管理清晰可控,还可以使用 Hilt。
class DemoViewModel(
val repository: IDemoRepository //依赖接口而非具体实现类
) : ViewModel() {
private val _data = MutableLiveData<DemoBean>()
val data = _data as LiveData<DemoBean> //转为不可变类型暴露给外部
fun getData() {
//调用Data层获取数据更新Livedata
_data.value = repository.getData()
}
}
class DemoViewModelFactory(private val repository: DemoRepository) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return DemoViewModel(repository) as T
}
}
2.3 View 层
class DemoActivity : AppCompatActivity() {
//获取ViewModel
val viewModel by viewModels<DemoViewModel> { DemoViewModelFactory(DemoRepository()) }
//观察Livedata
override fun onCreateView() { //Fragment就写在onViewCreated()中
observeData()
}
private fun observeData() {
viewModel.data.observe(this) { data ->
//用数据更新UI
}
}
}
本文介绍了如何利用观察者模式在MVP架构中管理数据变化与UI更新,重点讲解了ViewModel层(JetPackViewModel)、Model层(Repository)和View层(Activity/Fragment)的实现,以减少接口问题和内存泄漏风险。
675

被折叠的 条评论
为什么被折叠?



