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

引言

在做项目或者在学习的时候,或多或少会听到 MVVM 这个架构,那么现在来简单讲一下 MVVM 架构

MVVM(Model-View-ViewModel)框架的由来便是MVP(Model-View-Presenter)模式与 WPF 结合的应用方式时发展演变过来的一种新型架构框架;它立足于原有 MVP 框架并且把 WPF 的新特性糅合进去,以应对客户日益复杂的需求变化

先说说 MVVM 框架组成

一文读懂 Jetpack 组件开源库中 MVVM 框架架构_第1张图片

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 中注册一遍

一文读懂 Jetpack 组件开源库中 MVVM 框架架构_第2张图片

再来看另外一个 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 组件开源库中 MVVM 框架架构_第3张图片

Jetpack 全家桶系列之 ViewModel

  • ViewModel 的职责
  • 作为数据持有者
  • Fragment 间共享数据
  • 代替 Loader
  • ViewModel 源码分析
  • 如何做到 activity 重建后 ViewModel 仍然存在?
  • 如何做到 fragment 重建后 ViewModel 仍然存在?
  • 如何控制作用域?
  • 如何避免内存泄漏?
  • ViewModel 和 onSaveInstanceState

一文读懂 Jetpack 组件开源库中 MVVM 框架架构_第4张图片

完整版 Jetpack 全家桶高级开发学习笔记 获取方式: 私信发送 “笔记” 即可 免费获取

Jetpack 全家桶系列之 ViewModel

  • 数据驱动魔法师
  • DataBinding 基础
  • DataBinding 引入
  • 使用DataBinding 解决的问题及实现原理
  • Binding Adapter
  • DadaBinding + LiveData
  • 各种 findViewById 替代方案对比

一文读懂 Jetpack 组件开源库中 MVVM 框架架构_第5张图片

Jetpack 全家桶目录

一文读懂 Jetpack 组件开源库中 MVVM 框架架构_第6张图片

由于篇幅有限,资料就不做完全展示了;有需要完整版 Jetpack 全家桶高级开发学习笔记的朋友:可以 私信 发送 “笔记” 即可 免费获取

对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们

技术是无止境的,你需要对自己提交的每一行代码、使用的每一个工具负责,不断挖掘其底层原理,才能使自己的技术升华到更高的层面

加油!各位 Android 开发者们

你可能感兴趣的:(移动开发,Android,Jetpack,Android开发,开源,架构,android,android,jetpack,android,studio)