美文网首页Android开发经验谈Android技术知识Android开发
一文读懂 Jetpack 组件开源库中 MVVM 框架架构

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

作者: 程序老秃子 | 来源:发表于2022-09-08 16:21 被阅读0次

    引言

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

    相关文章

      网友评论

        本文标题:一文读懂 Jetpack 组件开源库中 MVVM 框架架构

        本文链接:https://www.haomeiwen.com/subject/hndonrtx.html