SlideShare a Scribd company logo
1 of 14
MVVM架构模式
分享人:李阳
____________
01
02
MVVM简介
ViewModel
03
04
LiveData
简单使用
目录
MVVM
是 Model-View-ViewModel的缩写,是一种架构模式,一种思想,区别于我们常说
的设计模式。
Model:模型,一般指后端下发数据;
View:视图,一般指我们看到的页面,负责显示数据和获取用户操作;
ViewModel:视图模型,是MVVM的核心部分,以数据驱动,它是连接View和
Model的桥梁。
常见的架构模式:MVC、MVP、MVVM,此处所讲的MVVM是基于google的
Jetpack组件LifeCycle、LiveData、ViewModel构成的,于Androidx环境中使用并
维护的。
1.1 什么是MVVM
两个方向:
一是将[视图]转化为[模型],即将所看到的页面转化为后端的数据。实现方
式是:事件监听。
二是将[模型]转化为[视图],即将后端传递的数据转为成所看到的页面。实
现方式是:数据绑定。
这两个方向都实现的,我们称之为数据的双向绑定。
1.2 MVVM数据流向
Model的数据模型只包含状态,ViewModel所封装出来的数据模型包含视图的状态和
行为两部分,这样的封装使得ViewModel可以完整地去描述View层。
ViewModel类似中转站(Value Converter),负责转换Model中的数据对象,使得数
据变得更加易于管理和使用。
职责主要是管理和提供和UI相关的数据。
2.1 ViewModel
LiveData的实现上可以说是订阅发布模式+生命周期感知,对于
Activity/Fragment等LifecycleOwner来说LiveData是观察者,监听者生命周
期,而同时LiveData又是被观察者,我们通过观察LiveData,实现数据和
View的关系构建。
LiveData是google发布的生命周期组件(lifecycle-aware components)中的
一个组件,除了能实现数据和View的绑定响应之外,它最大的特点就是具备
生命周期感知功能,这使得他具备以下优点:
1、解决内存泄漏问题;
2、解决常见的View空异常;
3.1 LiveData
①内存泄露:
由于LiveData会在Activity/Fragment等具有生命周期的lifecycleOwner
onDestory的时候执行removeObserve,使自己与观察者自动解绑,所以
解决了可能存在的内存泄漏问题。之前我们为了避免这个问题,一般有注
册绑定的地方都要解绑,而LiveData利用生命周期感知功能解决了这一问
题。
②NPE:
我们通常在一个异步任务回来后需要更新View,而此时页面可能已经被回
收,导致经常会出现View空异常,而LiveData由于具备生命周期感知功
能,在界面可见的时候才会进行响应,如果在界面不可见的时候发起
notify,会等到界面可见的时候才进行响应更新,所以就很好的解决了空异
常的问题。
3.2 LiveData优点
首先Activity/Fragment实现LifecycleOwner接口,内部有一个LifecycleRegistry存
放生命周期State、Event等。
每个A/F在启动时都会自动添加进来一个无界面的Fragment,由于添加进来的
Fragment与A/F的生命周期是同步的,所以当A/F执行相应生命周期方法的时候,
同步的也会执行无界面Fragment的生命周期方法,它会在执行自己生命周期方法
的时候更新A/F的LifecycleRegistry里的生命周期State、Event,并且
notifyStateChanged来通知监听A/F生命周期的观察者。
这样就到达了生命周期感知的功能,其实是一个隐藏的Fragment来实现了监听者
能感知到A/F的生命周期。
只要LiveData注册了A/F的LifecycleOwner接口监听,也就拥有了感知生命周期的
能力。
3.3 LiveData感知生命周期原理
LiveData的粘性指的是消息可以在observer注册之前发送,当observer注册时,依然可
接收到之前发送的这个消息。
比如有一个数据mUser(LiveData)在A页面setValue()之后,然后再从A页面打开B页
面,在B页面中开始订阅该LiveData,B页面打开的时候生命周期方法执行,会进行
notify,此时又同时满足页面是从不可见变为可见、数据版本不一致等条件,所以一开
始进B页面,B页面的订阅就会被响应。
这就是所谓的粘性,A页面在发消息的时候B页面是还没创建还没订阅该数据的,但是
进入B页面订阅,之前在A中发的消息就会被响应。
3.4 LiveData的粘性
4.1 VM示例代码
获取ViewModel对象实例,通过vm获取LiveData并添加观察者,此时当数据改变,
LiveData调用set或者post方法后,通知观察者,变更UI。
4.2 Fragment、Activity监听数据变化
方式一:
ViewModelProviders.of(this).get(LiveViewModel.class);
这种方式创建的VM对象和this是一一绑定的,即在Activity1处,多处获取VM对象,对
象地址值是一个,即是同一个VM对象。
方式二:
getDefaultViewModelProviderFactory().create(LiveViewModel.class);
这种方式创建的VM对象是不同的,每次调用都会创建一个新的VM对象。
4.3 ViewModel对象的创建方式
MVVM进一步降低了代码的耦合,通过传入Fragment或者activity获取实例,并由
lifecycle统一管理生命周期与监听,已尽可能防止内存泄露发生。
但是如果一味将逻辑处理放入vm中,则可能造vm过于臃肿,所以需要比较严格的遵守
单一责任原则,只负责提供和管理UI数据,手段根据业务自行使用,比如vm和
presenter结合等。
当然VM还有很多使用注意点,比如不可持有context等,这里就不在详述了。
对于架构模式的使用,仁者见仁智者见智,不存在哪个一定比哪个更强更好,选用适
合的即可,学习更新的思想,用于实践即可。
总结
THANK YOU!
分享人:李阳

More Related Content

Similar to MVVM.pptx

ASP.NET MVC Model 的設計與使用 twMVC#10
ASP.NET MVC Model 的設計與使用 twMVC#10ASP.NET MVC Model 的設計與使用 twMVC#10
ASP.NET MVC Model 的設計與使用 twMVC#10twMVC
 
Single-Page Application Design Principles 101
Single-Page Application Design Principles 101Single-Page Application Design Principles 101
Single-Page Application Design Principles 101Jollen Chen
 
MVC MVVM MVVMC
MVC MVVM MVVMCMVC MVVM MVVMC
MVC MVVM MVVMCNg Hui Qin
 
Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2twMVC
 
twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有twMVC
 
與 Asp.net mvc 的第一次親密接觸 - twMVC#1
與 Asp.net mvc 的第一次親密接觸 - twMVC#1與 Asp.net mvc 的第一次親密接觸 - twMVC#1
與 Asp.net mvc 的第一次親密接觸 - twMVC#1twMVC
 
Asp.Net MVC 一教就上手
Asp.Net MVC 一教就上手Asp.Net MVC 一教就上手
Asp.Net MVC 一教就上手Study4TW
 
KSDG#8_net第一次親密接觸_Brian Cheng
KSDG#8_net第一次親密接觸_Brian ChengKSDG#8_net第一次親密接觸_Brian Cheng
KSDG#8_net第一次親密接觸_Brian ChengStipc Nsysu
 
技术框架对比
技术框架对比技术框架对比
技术框架对比Tony Deng
 
ASP.NET MVC The Begining
ASP.NET MVC The BeginingASP.NET MVC The Begining
ASP.NET MVC The BeginingSimon Huang
 
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練42016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4Duran Hsieh
 
利用 ASP.NET MVC 提升您的 Web 應用程式
利用 ASP.NET MVC 提升您的 Web 應用程式利用 ASP.NET MVC 提升您的 Web 應用程式
利用 ASP.NET MVC 提升您的 Web 應用程式Chui-Wen Chiu
 
twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)
twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)
twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)twMVC
 
ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4
ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4
ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4twMVC
 
twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸twMVC
 
twMVC#20 | ASP.NET MVC View 開發技巧小錦囊
twMVC#20 | ASP.NET MVC View 開發技巧小錦囊twMVC#20 | ASP.NET MVC View 開發技巧小錦囊
twMVC#20 | ASP.NET MVC View 開發技巧小錦囊twMVC
 
Asp.net+mvc4框架揭秘
Asp.net+mvc4框架揭秘Asp.net+mvc4框架揭秘
Asp.net+mvc4框架揭秘Zhenhua Tang
 

Similar to MVVM.pptx (20)

ASP.NET MVC Model 的設計與使用 twMVC#10
ASP.NET MVC Model 的設計與使用 twMVC#10ASP.NET MVC Model 的設計與使用 twMVC#10
ASP.NET MVC Model 的設計與使用 twMVC#10
 
Mvc
MvcMvc
Mvc
 
Single-Page Application Design Principles 101
Single-Page Application Design Principles 101Single-Page Application Design Principles 101
Single-Page Application Design Principles 101
 
MVC MVVM MVVMC
MVC MVVM MVVMCMVC MVVM MVVMC
MVC MVVM MVVMC
 
Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2Asp.net mvc 從無到有 -twMVC#2
Asp.net mvc 從無到有 -twMVC#2
 
twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有twMVC#02 | ASP.NET MVC 從無到有
twMVC#02 | ASP.NET MVC 從無到有
 
與 Asp.net mvc 的第一次親密接觸 - twMVC#1
與 Asp.net mvc 的第一次親密接觸 - twMVC#1與 Asp.net mvc 的第一次親密接觸 - twMVC#1
與 Asp.net mvc 的第一次親密接觸 - twMVC#1
 
Asp.Net Mvc 1.0
Asp.Net Mvc 1.0Asp.Net Mvc 1.0
Asp.Net Mvc 1.0
 
Asp.Net MVC 一教就上手
Asp.Net MVC 一教就上手Asp.Net MVC 一教就上手
Asp.Net MVC 一教就上手
 
KSDG#8_net第一次親密接觸_Brian Cheng
KSDG#8_net第一次親密接觸_Brian ChengKSDG#8_net第一次親密接觸_Brian Cheng
KSDG#8_net第一次親密接觸_Brian Cheng
 
技术框架对比
技术框架对比技术框架对比
技术框架对比
 
ASP.NET MVC The Begining
ASP.NET MVC The BeginingASP.NET MVC The Begining
ASP.NET MVC The Begining
 
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練42016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練4
 
利用 ASP.NET MVC 提升您的 Web 應用程式
利用 ASP.NET MVC 提升您的 Web 應用程式利用 ASP.NET MVC 提升您的 Web 應用程式
利用 ASP.NET MVC 提升您的 Web 應用程式
 
twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)
twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)
twMVC#04 | ASP.NET MVC 4 新功能介紹(快速上手)
 
ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4
ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4
ASP.NET MVC 4 新功能介紹(快速上手) -twMVC#4
 
twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸twMVC#01 | ASP.NET MVC 的第一次親密接觸
twMVC#01 | ASP.NET MVC 的第一次親密接觸
 
twMVC#20 | ASP.NET MVC View 開發技巧小錦囊
twMVC#20 | ASP.NET MVC View 開發技巧小錦囊twMVC#20 | ASP.NET MVC View 開發技巧小錦囊
twMVC#20 | ASP.NET MVC View 開發技巧小錦囊
 
Ch1
Ch1Ch1
Ch1
 
Asp.net+mvc4框架揭秘
Asp.net+mvc4框架揭秘Asp.net+mvc4框架揭秘
Asp.net+mvc4框架揭秘
 

MVVM.pptx

Editor's Notes

  1. 设计模式和架构模式: 设计模式:对重复出现问题的总结和解决实践。https://www.cnblogs.com/FlyAway2013/p/10163221.html 架构模式:也叫架构风格,描述软件系统的基本结构和纲要。 https://medium.com/@givemepass/android-mvvm-%E6%9E%B6%E6%A7%8B-%E4%B8%80-375192753d25 非Androidx环境:已经不维护。 implementation 'android.arch.lifecycle:extensions:1.1.1' annotationProcessor "android.arch.lifecycle:compiler:1.1.1" 数据驱动
  2. 既然是数据驱动,肯定有数据流向; 比较流向的有vm+dataBinding或者直接使用LiveData;此处后者。
  3. 不会随着设置变更而销毁,即act旋转销毁重新创建,但是vm存在。 1、vm可以共享多个Fragment中的数据。 2、vm可以和livedata共同使用。
  4. https://juejin.im/post/6844903728877846542 为什么会有这些优点呢?
  5. 1.destroy时自动解绑; 2.页面可见的才执行响应方法;
  6. 首先Activity/Fragment是LifecycleOwner(26.1.0以上的support包中Activity已经默认实现了LifecycleOwner接口),内部都会有一个LifecycleRegistry存放生命周期State、Event等。而真正核心的操作是,每个Activity/Fragment在启动时都会自动添加进来一个Headless Fragment(无界面的Fragment),由于添加进来的Fragment与Activity的生命周期是同步的,所以当Activity执行相应生命周期方法的时候,同步的也会执行Headless Fragment的生命周期方法,由于这个这个Headless Fragment对我们开发者来说是隐藏的,它会在执行自己生命周期方法的时候更新Activity的LifecycleRegistry里的生命周期State、Event, 并且notifyStateChanged来通知监听Activity生命周期的观察者。这样就到达了生命周期感知的功能,所以其实是一个隐藏的Headless Fragment来实现了监听者能感知到Activity的生命周期。
  7. 如果不想有这个粘性也没问题,跟踪源码能发现观测的回调判断处有关version,手动设置这个version大小即可不触发粘性。
  8. 方式二,从create处逆向跟了部分源码,发现都是create,最后调到了方式一的底层创建方法,用代码也验证了,及时在同一个方法内,这么获取的vm对象也不同,暂时没懂
  9. https://v.qq.com/x/page/m0605c1sejh.html vm里不要有act。f。view的引用,即不要传入context,因为act销毁,但是vm持有act的this,则vm持有了一个本应回收的对象,导致不能回收,造成内存泄露。 vm不可替换onSaveInstanceState,后者存小量对象,比如一个用户的id而不是整个用户对象数据。 经测试,act销毁,vm的clear优先于act的ondestroy方法,但是具体vm对象的销毁回收时机暂未研究明白,需要深入源码查看。