一文读懂 Jetpack 组件开源库中 MVVM 框架架构

引言

在做项目或者在学习的时候,或多或少会听到 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 开发者们

猜你喜欢

转载自blog.csdn.net/m0_62167422/article/details/126766612