Android 架构 - MVVM

本文介绍了如何利用观察者模式在MVP架构中管理数据变化与UI更新,重点讲解了ViewModel层(JetPackViewModel)、Model层(Repository)和View层(Activity/Fragment)的实现,以减少接口问题和内存泄漏风险。

 一、概念

概念基于观察者模式,数据的变化会自动更新到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
        }
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值