一、MVVM组成

(1).Model:数据层,包含数据实体和对数据实体的操作
(2).View:界面层,对应于Activity,XML,View,负责数据显示以及用户交互。
(3).ViewModel:关联层,将Model和View进行绑定,Model或者View更改时,实时刷新对方。

使用细节

1.View只做和UI相关的工作,不涉及任何业务逻辑,不涉及操作数据,不处理数据。UI和数据严格的分开
2.ViewModel只做和业务逻辑相关的工作,不涉及任何和UI相关的操作,不持有控件引用,不更新UI。

二、Android MVVM持有关系与模式图

View
显而易见Activity/Fragment(XML)便是MVVM中的View,当收到ViewModel传递过来的数据时,Activity/Fragment负责将数据以你喜欢的方式显示出来。当然View还包括ViewDataBinding

ViewModel
ViewModel作为Activity/Fragment与其他组件的连接器。负责转换和聚合Model中返回的数据,使这些数据易于展示,并把这些数据改变即时通知给Actvity/Fragment。
ViewModel是具有生命周期意识的,当Activity/Fragment销毁时ViewModel的onClear方法会被回调,你可以在这里做一些清理工作。LiveData是具有生命周期意识的一个可观察的数据持有者,ViewModel中的数据有LiveData持有,并且只有当Activity/Fragment处于活动时才会通知UI数据的改变,避免无用的刷新UI。

Model
Repository及其下方就是model了。Repository负责提取和处理数据。数据来源可以是本地数据库,也可以来自网络,这些数据统一有Repository处理,一般对外隐藏数据获取方式

Binder绑定器
Android中的数据绑定技术由DataBinding和LiveData共同实现。当Activity/Fragment接收到来自ViewModel中的新数据时(由LiveData自动通知数据的改变),将这些数据通过DataBinding绑定到ViewDataBinding中,UI将会自动刷新。

三、Jetpack组件

1.databind

使用声明性格式将布局中的界面组件绑定到应用的数据源(就是相互赋值),viewModel与view进行交互的核心组件,注意对 Binding Adapter的使用官方使用

2.viewModel

官方介绍

ViewModel is a class that is responsible for preparing and managing the data for an Activity or a Fragment. It also handles the communication of the Activity / Fragment with the rest of the application (e.g. calling the business logic classes)

ViewModel是一个负责为Activity或Fragment准备和管理数据的类。它还处理Activity/Fragment与应用程序其余部分的通信(例如调用业务逻辑类)。

屏幕旋转Activity 与ViewMode声明周期对比

可以看到即使是发生屏幕旋转,旋转之后拿到的ViewModel跟之前的是同一个实例,即发生屏幕旋转时,ViewModel并不会消失重建;而如果Activity是正常finish(),ViewModel则会调用onClear()销毁。

基于此我们应该了解:

  • ViewModel可以在Activity配置更改中保留其状态。它保存的数据可立即供下一个Activity实例使用,无需在onSaveInstanceState()中保存数据并手动恢复。
  • ViewModel比特定的Activity或Fragment实例更长。
  • ViewModel允许在Fragments之间轻松共享数据(这意味着您不再需要通过活动协调操作)。
  • ViewModel将保留在内存中,直到它的作用域生命周期永久消失.
  • 由于ViewModel比Activity或Fragment实例更长,因此它不应直接引用其中的任何Views或保持对上下文的引用。这可能会导致内存泄漏
  • 如果ViewModel需要Application上下文(例如,查找系统服务),它可以继承AndroidViewModel类并具有在构造函数中接收Application的构造函数。

3.LiveData

LiveData是一个可观察的数据存储类,它可以包含任何类型的数据,并在数据发生变化的时候通知给观察者,也就是Activity\Fragment,让它及时更新。LiveData只会将更新通知传递给处于活跃状态的观察者(STARTED\RESUMED)。

当Lifecycle对象的状态变为DESTROYED的时候,也就是Activity\Fragment生命周期被销毁时,系统会立即退订

官方地址

注意点:LiveData是一种可观察的数据存储器类。通俗点说就是存储数据,同时可以被观察者观察数据的变化,具有生命周期感知能力,这种感知能力可确保LiveData仅更新处于活跃生命周期状态的应用组件观察者。

因此,在其他应用场景要考虑数据丢包问题

Android MVVM详解相关推荐

  1. Android 开发架构-MVC MVP MVVM详解

    何为架构 架构,即程序的逻辑组织结构,是指导开发过程中划分程序逻辑模块的关键,好的架构要使程序达到高内聚低耦合的设计目标.例如一个人,身体的骨骼即为身体的架构,有了基本骨架之后,才可以决定在头颅里开发 ...

  2. Android MVP 详解(上)

    作者:李旺成 时间:2016年4月3日 "Android MVP 详解(下)"已经发布,欢迎大家提建议. MVP 在 Android 上的使用其实已经有挺长一段时间了,长到似乎有点 ...

  3. 【转】Android菜单详解——理解android中的Menu--不错

    原文网址:http://www.cnblogs.com/qingblog/archive/2012/06/08/2541709.html 前言 今天看了pro android 3中menu这一章,对A ...

  4. Android菜单详解——理解android中的Menu

    前言 今天看了pro android 3中menu这一章,对Android的整个menu体系有了进一步的了解,故整理下笔记与大家分享. PS:强烈推荐<Pro Android 3>,是我至 ...

  5. Android LayoutInflater详解

    Android LayoutInflater详解 在实际开发中LayoutInflater这个类还是非常有用的,它的作用类 似于findViewById().不同点是LayoutInflater是用来 ...

  6. android Fragments详解

    android Fragments详解一:概述 android Fragments详解二:创建Fragment 转载于:https://my.oschina.net/liangzhenghui/blo ...

  7. android WebView详解,常见漏洞详解和安全源码(下)

    上篇博客主要分析了 WebView 的详细使用,这篇来分析 WebView 的常见漏洞和使用的坑.  上篇:android WebView详解,常见漏洞详解和安全源码(上)  转载请注明出处:http ...

  8. android WebView详解,常见漏洞详解和安全源码(上)

    这篇博客主要来介绍 WebView 的相关使用方法,常见的几个漏洞,开发中可能遇到的坑和最后解决相应漏洞的源码,以及针对该源码的解析.  由于博客内容长度,这次将分为上下两篇,上篇详解 WebView ...

  9. android子视图无菜单,Android 菜单详解

    Android中菜单分为三种,选项菜单(OptionMenu),上下文菜单(ContextMenu),子菜单(SubMenu) 选项菜单 可以通过两种办法增加选项菜单,一是在menu.xml中添加,该 ...

最新文章

  1. 长假后第一天不想工作,这病咋治?
  2. 一维有限元法matlab,一维有限元法解常微分方程
  3. 简易版jQuery——mQuery
  4. 1024电商项目的邮箱验证码与图形验证码功能模块
  5. scala元组 数组_Scala中的数组
  6. mysql使用navicat(建表前与建表后)添加时间戳(创建时间、自动更新时间)
  7. webService(简单小demo)
  8. maven创建一个web项目(springmvc项目)
  9. spark操作redis_Spark对接Redis快速入门
  10. 微软认知语音服务 语音识别
  11. 《Java程序员职场全攻略:从小工到专家》连载九:散兵游勇还是团队作战
  12. ATMEGA128——初探
  13. windows下安装MinGW及C++的环境配置
  14. 自媒体怎么做?5个操作步骤,普通人也可以做
  15. 黑群晖DSM7.1.0物理机安装教程
  16. ppt学习-默认设置
  17. 蓝牙sbc怎么解决_谈一谈蓝牙协议?
  18. html有序列表标签圆点,什么是无序列表、有序列表、定义列表?html列表标签学习笔记...
  19. 北漂四年,25K,程序员,我依然单身!
  20. php让浏览器全屏,H5实现浏览器全屏API(全屏进入和全屏退出)

热门文章

  1. java计算机毕业设计妇女健康保健系统MyBatis+系统+LW文档+源码+调试部署
  2. 代码工程必备能力—Commit 规范
  3. 送给她超浪漫的表白信——她感动哭了(.html)
  4. inventor软件绘制百叶窗方法_「百叶窗模型」solidworks怎么绘制百叶窗模型? - seo实验室...
  5. 【Python】识别.yaml/.ini/.xml文件
  6. 【Apollo】决策技术分享
  7. Android适配字体过大的手机(老年机)
  8. Printers(一) 打印机配置信息
  9. 吉林省单招计算机学校,吉林省单招学校有哪些大学
  10. 这款小程序开发神器你知道吗?