引言
在做项目或者在学习的时候,或多或少会听到 MVVM 这个架构,那么现在来简单讲一下 MVVM 架构
MVVM(Model-View-ViewModel)框架的由来便是MVP(Model-View-Presenter)模式与 WPF 结合的应用方式时发展演变过来的一种新型架构框架;它立足于原有 MVP 框架并且把 WPF 的新特性糅合进去,以应对客户日益复杂的需求变化
先说说 MVVM 框架组成
MVVM 分为 Model、View、ViewModel 三者
- Model:代表数据模型,数据和业务逻辑都在Model层中定义
- View:代表UI视图,负责数据的展示
- ViewModel:业务处理和逻辑转化,model和view的中转
MVVM 就是将其中的 View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开
当然这些事 ViewModel 已经帮我们做了,它可以取出 Model 的数据同时帮忙处理 View 中由于需要展示内容而涉及的业务逻辑
再谈谈 MVVM 框架特点
快速开发
- 只需要写项目的业务逻辑,不用去关心网络请求、权限申请、View 的生命周期等问题,撸起袖子就是干,高效开发
维护方便
- MVVM 开发模式,低耦合,逻辑分明;Model 层负责将请求的数据交给 ViewModel
- ViewModel 层负责将请求到的数据做业务逻辑处理,最后交给 View 层去展示,与 View 一一对应
- View 层只负责界面绘制刷新,不处理业务逻辑,非常适合分配独立模块开发
数据绑定
- 满足 google 目前控件支持的 databinding 双向绑定,并扩展原控件一些不支持的数据绑定
- 例如将图片的 url 路径绑定到 ImageView 控件中,在 BindingAdapter 方法里面则使用 Glide 加载图片
- View 的 OnClick 事件在 BindingAdapter 中方法使用 RxView 防重复点击,再把事件回调到 ViewModel 层,实现 xml 与 ViewModel 之间数据和事件的绑定(框架里面部分扩展控件和回调命令使用
- UI 的事件儿绑定请在 UI 中处理,否则不好维护,可以在 UI 中触发,UI 中持有 viewmodel ,调用 viewmodel 中的业务即可
基类封装
- 专门针对 MVVM 模式打造的BaseActivityMVVM、BaseFragmentMVVM、BaseViewModelMVVM
- 在 View 层中不再需要定义 ViewDataBinding 和 ViewModel ,直接在 BaseActivityMVVM 、 BaseFragmentMVVM 上限定泛型即可使用.支持 navigation 导航 Fragment 的管理,导航返回时候回调用 OnCreateView , BaseFragmentMVVM 已经封装
- ToolbarViewModel 封装了标题返回,标题和右侧文字不要在 BaseActivit 和 BaseFragmentMVVM 中进行任何处理即可使用,普通界面只需要编写 Fragment ,然后使用 ContainerActivity 盛装(代理),这样就不需要每个界面都在 AndroidManifest 中注册一遍
再来看另外一个 MVVM 的问题
非简单数据模型,复合数据模型( DO 的属性值不是一个 string ,而是一个 Object ,且这个 Object 可能还嵌套多层 Obejct 的时候)的处理办法,这个一般的 MVVM框架 直接不考虑,或者通过长字段名的方式绕过这个问题
这个问题是这样的,早在 10 几年前, java structs 框架流行的时候就出现了;当一个表单,出现需要对两个 Java Bean 做 update 操作时候,一个 bean 是 user ,一个 bean 是成绩
对应的表单字段名,就是 user 表 .name, user 表 .id,score 表 .point
在 struct2 里面,处理逻辑是把 “点” 作为特殊符号,在做 form 序列化时候,非包含点的字段的值都是 string ,包含点的字段是一个 Object ,比如刚才的 form 序列化之后结果就是 { user: {id :’’ , name: ‘’}, score: {id: ‘’, point: ‘’}}
同理在 MVVM 实现时,也是一样,认为点是分割对象的关键字,这样我们就可以实现把多个对象嵌套到View模板里面,实现复合Object的双向映射
至此,我们今天 MVVM 的开源框架特性与知识点就介绍到这里了;希望以上的内容能够对大家有所帮助,关于 MVVM 的相关技术问题,我们还要去好好的学习剖析;因此我把工作中遇到的 Jetpack 组件开源库相关问题,以及对网上大部分的资料的收集和整理,最终整合出了一份 《Jetpack 全家桶高级开发学习笔记》,有需要这份学习笔记的朋友,可以 简信 发送 “笔记” 即可 免费获取 希望大家通过阅读这份学习笔记,能够查漏补缺;早日精通 Jetpack
资料内容展示如下:
Jetpack 全家桶系列之 Lifecycle
- 万物基于 Lifecycle
- 手动管理生命周期的痛苦你不懂
- 按照惯例的思考
- 观察者模式
- 引入 Lifecycle 后
- 源码结构
- 简单的源码分析
- activity 生命周期处理
- fragment 生命周期处理
- Lifecycle State 大小比较
Jetpack 全家桶系列之 ViewModel
- ViewModel 的职责
- 作为数据持有者
- Fragment 间共享数据
- 代替 Loader
- ViewModel 源码分析
- 如何做到 activity 重建后 ViewModel 仍然存在?
- 如何做到 fragment 重建后 ViewModel 仍然存在?
- 如何控制作用域?
- 如何避免内存泄漏?
- ViewModel 和 onSaveInstanceState
完整版 Jetpack 全家桶高级开发学习笔记 获取方式: 简信发送 “笔记” 即可 免费获取
Jetpack 全家桶系列之 ViewModel
- 数据驱动魔法师
- DataBinding 基础
- DataBinding 引入
- 使用DataBinding 解决的问题及实现原理
- Binding Adapter
- DadaBinding + LiveData
- 各种 findViewById 替代方案对比
Jetpack 全家桶目录
由于篇幅有限,资料就不做完全展示了;有需要完整版 Jetpack 全家桶高级开发学习笔记的朋友:可以 简信 发送 “笔记” 即可 免费获取
对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们
技术是无止境的,你需要对自己提交的每一行代码、使用的每一个工具负责,不断挖掘其底层原理,才能使自己的技术升华到更高的层面
加油!各位 Android 开发者们
网友评论