MVC:

  • 视图(View):用户界面。
  • 控制器(Controller):业务逻辑
  • 模型(Model):数据保存

  1. View 传送指令到 Controller
  2. Controller 完成业务逻辑后,要求 Model 改变状态
  3. Model 将新的数据发送到 View,用户得到反馈

操作方式: 用户操作View或Controller

缺点:View与Model之间存在关系,Activity既是View也是Controller,代码量大。

MVP:

Controller改为Presenter

  1. 各部分之间的通信,都是双向的。
  2. View 与 Model 不发生联系,都通过 Presenter 传递。
  3. View 代码少,不部署任何业务逻辑,称为"被动视图"(Passive View),即没有任何主动性,而 Presenter代码多,所有逻辑都部署在那里。

MVVM:

Presenter改为ViewModel

采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。用到了检查者模式。

优点:

低耦合:View和Model不相互联系

可重用性:你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑

Android的ViewModel的生命周期贯穿整个应用。

ViewModel:

  1. 可以提供和管理UI界面数据。(将加载数据与数据恢复从 Activity or Fragment中解耦)
  2. 可感知生命周期的组件。
  3. 不会因配置改变而销毁。
  4. 可以配合 LiveData 使用。
  5. 多个 Fragment 可以共享同一 ViewModel。

LiveData:

LiveData是一个在线程间传递数据的容器。当后台线程得到数据后,通过setValue()、postValue()方法投递数据。其他线程通过getValue()得到数据。

setValue()只能在主线程中调用,postValue()可以在任何线程中调用。

LiveData具有保证UI和状态一致、避免内存泄漏、避免手动管理生命周期等优点。

在调用observe()时,第一个参数是LifecycleOwner,第二个参数是Observer。LiveData建立一个LifecyleBoundObserver对象,将这两个参数绑定到一起,来接收Lifecycle的生命周期更新和LiveData的数据更新。LifecycleBoundObserver是一个的内部类,它持有了LiveData引用。当生命周期发生变化(LifecycleRegistry.handleLifecyleEvent)时,LifecycleBoundObserver调用LiveData的dispatchingValue()方法,获取最新数据。

LiveData的特点:

  • 采用观察者模式,数据发生改变,可以自动回调(比如更新UI)。
  • 不需要手动处理生命周期,不会因为Activity的销毁重建而丢失数据。
  • 不会出现内存泄漏。
  • 不需要手动取消订阅,Activity在非活跃状态下(pause、stop、destroy之后)不会收到数据更新信息。

ViewModel+LiveData 实现Fragment之间通信

Android—MVC、MVP、MVVM相关推荐

  1. android mvc mvp 区别,谈谈Android框架 MVC、MVP、MVVM的区别

    今天写写Android的MVC.MVP.MVVP三个框架的对比,并加深自己对这三个框架的理解. 548b9bea8dc18.gif 一 . MVC:Model-View-Controller MVC全 ...

  2. Android App的架构设计:从VM、MVC、MVP到MVVM

    随着Android应用开发规模的扩大,客户端业务逻辑也越来越复杂,已然不是简单的数据展示了.如同后端开发遇到瓶颈时采用的组件拆分思想,客户端也需要进行架构设计,拆分视图和数据,解除模块之间的耦合,提高 ...

  3. MVC、MVP、MVVM:谁才是Android开发的终极之选?

    概述 MVC.MVP.MVVM 都是在 Android 开发中经常用到的架构思想,它们都是为了更好地分离代码.提高代码可复用性.方便维护等目的而设计的.下面对这三种架构思想进行简单的介绍和比较. MV ...

  4. Android开发模式万佛朝中MVX(MVC、MVP、MVVM)

    今天公司的测试服务器开小差了,后台被吐槽的体无完肤,虽然我们都知道跟他没有什么关系,但是生活需要乐趣,总要有人背锅,哈哈!~~~暂时没有环境开发了,那就分享一下之前做的一篇关于Android开发模式的 ...

  5. Android高精战争(MVC、MVP、MVVM)

    和MVC框架模式一样,Model模型处理数据代码不变在Android的App开发中,很多人经常会头疼于App的架构如何设计: 我的App需要应用这些设计架构吗? MVC,MVP等架构讲的是什么?区别是 ...

  6. 手写Android中MVC、MVP、MVVM对比

    1. MVC.MVP.MVVM 1.1 MVC Model 模型层: 业务模型的数据与行为=数据+业务逻辑 View 展示层: 管理用户界面=组合模式的View集合 Controller: Model ...

  7. Android开发框架模式(MVC、MVP、MVVM)实例解析

    Android项目中,尤其是比较大型的项目开发中,模块内部的高聚合和模块间的低耦合性就显得尤为重要了.所以我们一般情况下需要为项目设计一种框架模式,通常情况下我们一般用到的三种MVC.MVP.MVVM ...

  8. 【Android】Android安卓架构MVC、MVP、MVVM之间的区别和联系(图解+案例+源码)

    https://github.com/SETANDGET/AndroidArchitectureDemo 代码 一.问题背景 二.Android安卓架构MVC.MVP.MVVM 1.MVC(Model ...

  9. [最全]Android安卓架构MVC、MVP、MVVM之间的区别和联系(图解+案例+源码)

    一.问题背景 博主最近在准备春招面试中介绍自己简历中Android项目的MVP架构,但是博主发现若自身不彻底弄懂Android安卓架构MVC.MVP.MVVM之间的区别和联系,博主将无法准确地向面试官 ...

  10. MVC、MVP、MVVM,我到底该怎么选?

    前言 MVC.MVP.MVVM是我们工作和面试中都比较重要的一块,但很多时候我们却有点迷惑.比如看了好多篇文章都搞不懂MVC到底是个啥本来想写个MVP写着写着就变成MVC了,到底Databing和MV ...

最新文章

  1. C++ sizeof 使用规则及陷阱分析【转】
  2. 市场规模占全国4成,广东物联网市场发展强劲
  3. 杭电OJ-1062_Text Reverse
  4. Java中this与super的区别
  5. java的或等于_Java中的“小于或等于”比较运算符是__________: !=|||=|=
  6. 使用Symantec Altiris 来监控 Dell 服务器 的 硬件
  7. 程序员伪装 AI 编程,竟骗来 2 亿的投资!
  8. vue的h函数_Vue中render中的h箭头函数
  9. TongWeb session超时配置
  10. 办理美国商务和旅游签证(B1 B2)和面签的奥秘
  11. excel如何设置保留两位小数
  12. java与模式孙悟空_设计模式之原型模式 - chenxkang的个人空间 - OSCHINA - 中文开源技术交流社区...
  13. 左边是地狱右边也是地狱_像我这样的设计师的特别地狱
  14. python turtle库输出文字_Python 海龟 turtle 画图讲解 (五):输入/输出文字及鼠标与键盘交互设计...
  15. Ceph Luminous 12.2.11 安装 nfs-ganesha
  16. linux搭建DNS域名解析服务
  17. #搜索#(ssl 1758)连通图
  18. 高效mongoDB开发规范
  19. 关于多项目的资源管理方法[范文学习]
  20. sql inject1

热门文章

  1. 江苏单招计算机网络试卷,江苏省2016年对口单招计算机专业综合理论试卷.doc
  2. 安卓期末项目源码_手机随时随地写Python,还可以开发安卓APP,太厉害了!
  3. python计算每月工资多少钱_[Python]CCF——工资计算(201612-2)
  4. springmvcdate类型接收不到_无线电小课堂:如何在市区环境有效接收短波信号,选什么天线?...
  5. 转行,转向哪里?电子工程师!!!
  6. 廉价公开课 | 快到没朋友?程序员必会的yolo模型(附福利)
  7. 计算机文化基础课程总结,计算机文化基础课程总结.docx
  8. java在dos中如何测试_[求助]怎么在java中模拟dos命令行
  9. mysql cannot connect_【IT专家】mysql远程访问cannot connect(10038) 问题解决的过程
  10. js代码自动排版_接口测试平台代码实现9:菜单常显