MVVM
在Android开发中,MVVM(Model-View-ViewModel)是一种基于数据驱动的架构设计模式,旨在分离应用的UI逻辑与业务逻辑。结合架构组件(如LiveData、ViewModel、DataBinding),可以有效地减少代码耦合、提升代码可维护性。MVVM模式强调数据驱动UI更新,使得应用逻辑和UI分离更加清晰。
Android其实从一开始就有数据/状态驱动的设计,也就是Android开发都很熟悉的drawable。drawable在使用时提供了诸如selector和level-list之类的模板,其本质就是状态驱动的思想,外部只需要控制控件当前的状态,就能控制它最终的显示,只不过这样的设计在当时没有延展到代码之中,在其实现中还是使用的局部变量和使令式的做法来做的。
MVVM由三部分组成:
- Model:数据源或业务逻辑层,负责处理应用中的数据部分,如网络请求、数据库,将处理结果提供给 ViewModel。
- View:UI展示层,负责界面的显示、用户交互,观察 ViewModel 中的数据变化,并根据数据的变化自动更新UI。可以使用DataBinding绑定ViewModel的。
- ViewModel:连接View与Model的中间层,负责持有UI的数据,并且通过观察者模式来响应数据的变化,从而驱动UI更新。从 Model 中获取数据,且不依赖于 View。ViewModel 中通常使用 LiveData 或 StateFlow 来管理数据的状态。
ViewModel
ViewModel 是 Jetpack 架构组件的核心成员之一,为管理与界面相关的数据而设计。
它通过生命周期感知能力,确保数据在配置变更(如屏幕旋转)时持久存在,并将数据逻辑与 UI 控制器(Activity/Fragment)解耦,显著提升代码的可维护性和可测试性。ViewModel 其生命周期感知能力和数据持久化特性显著提升了应用的稳定性和可维护性。通过结合 LiveData、Room、Retrofit 等组件,可构建高效、可扩展的架构。
一、ViewModel 的核心作用
- 数据持久。ViewModel 的生命周期与 UI 控制器绑定,但不受配置变更影响。当 Activity 或 Fragment 因配置变更(如屏幕旋转)重建时,ViewModel 会保留数据,避免重复加载。无需通过onSaveInstanceState手动序列化。当 Activity/Fragment 彻底销毁时,ViewModel 才会自动清理资源。
- 解耦 UI 与数据逻辑。ViewModel 作为数据持有者,负责处理业务逻辑和数据转换,而 UI 控制器仅关注数据展示和用户交互。例如,在列表页面中,ViewModel 可封装数据获取逻辑,UI 层只需观察数据变化并更新界面。
- 跨组件共享数据。同一作用域(如 Activity)内的多个 Fragment 可共享同一个 ViewModel 实例,实现数据共享。例如,主 Fragment 和详情 Fragment 通过共享 ViewModel 同步数据状态。
二、ViewModel 的关键实现机制
每个 Activity/Fragment 持有一个ViewModelStore,用于存储其关联的 ViewModel 实例。配置变更时,ViewModelStore被保留,新创建的 UI 控制器可直接复用原 ViewModel。可通过工厂模式ViewModelProvider创建 ViewModel 实例。
三、ViewModel 实践注意
- 避免持有 ContextViewModel。不应直接引用 Activity/Fragment 的 Context,以免引发内存泄漏。若需 Context,可继承AndroidViewModel并通过构造函数注入Application实例。
- 数据不可变性。通过 LiveData 暴露数据时,应返回不可变类型(如LiveData而非MutableLiveData),防止外部直接修改数据。
- 结合 DataBinding。通过 DataBinding 将 UI 控件与 ViewModel 直接绑定,减少样板代码。设置ViewDataBinding的lifecycleOwner确保数据更新与 UI 生命周期同步。
Hilt
Hilt作为Android的依赖注入库,进一步简化了MVVM的依赖管理。通过@AndroidEntryPoint注解Activity/Fragment,使用@Inject构造函数注入依赖,使MVVM组件更易于测试和维护。

7741

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



