ViewModel 的作用可以区分 2 个维度来理解: 1、界面控制器维度: 在最初的 MVC 模式中,Activity / Fragment 中承担的职责过重,因此,在后续的 UI 开发模式中,我们选择将...因此,我们使用 ViewModel 来承担界面控制器的职责,并且配合 LiveData / Flow 实现数据驱动。...来创建 ViewModel。...创建 ViewModelProvider 工具类后,你将通过 get() 方法来创建 ViewModel 的实例。...总结 到这里,Jetpack 中的 ViewModel 组件就讲完了。下一篇文章,我们来讨论 LiveData 的替代方案 Flow[12]。关注我,带你了解更多。
ViewModelStore类是一个存储ViewModel的容器。当UI控制器创建时,系统会为其创建一个ViewModelStore实例。...当 UI控制器销毁时,系统会销毁其对应的ViewModelStore实例。 ViewModel在创建时,会将自身注册到其所在的ViewModelStore实例中。...的创建与ViewModel的销毁,都与Lifecycle有关,这样就让ViewModel具有以下特性: 生命周期感知: ViewModel是生命周期感知的,它会自动跟踪UI控制器的生命周期,并在适当的时候进行清理...为什么需要ViewModelStore ViewModelStore是用于管理ViewModel实例的生命周期的一种机制。...ViewModelStore通过管理ViewModel实例的生命周期,确保在重新创建UI时,旧的ViewModel实例被正确地销毁,而新的ViewModel实例被正确地创建。
简单来说:ViewModel是以关联生命周期的方式来存储和管理UI相关数据的类,即使configuration发生改变(例如屏幕旋转),数据仍然可以存在不会销毁....图中展示了当一个Activity经过屏幕旋转后的生命周期状态改变,右侧则是ViewModel的生命周期状态。...我们可以看到ViewModel的生命周期并不会跟随着Activity的生命周期变化而变化,虽然ViewModel是由该Activity创建的。...到这里ViewModel的基本使用方式我们已经了解了,接下来我们来分析一下它具体是怎么实现的?...到这里VM的创建过程就差不多了,而我们发现他并没有和生命周期有什么相关的东西,或者说VM是怎样保证的的数据不被销毁的呢?
在JetPack架构中,ViewModel组件是一个可以感知生命周期的形式来存储和管理视图相关的数据的组件,因此它适合以下场景。 适合需要保存大量数据的场景。...二、生命周期 我们知道,Android的Activity/Fragment是有生命周期的,我们可以在不同的生命周期函数中执行不同的操作来达到不同的目的。...由于ViewModel是保存在内存中的,所以ViewModel的生命周期并不会随Activity/Fragment的生命周期发生变化 。...下图是官方给出的ViewModel与Activity的生命周期的对应关系示意图。...来存储ViewModel的数据的。
,而数据的获取和处理则交由ViewModel来管理。...ViewModelStore是一个存储ViewModel实例的容器,它的生命周期与UI控制器的生命周期关联。...在UI控制器(Activity或Fragment)被销毁时,ViewModelStore会清理其中的ViewModel实例,避免内存泄漏。...ViewModelProvider通过ViewModelStoreOwner来获取ViewModelStore,并通过ViewModelStore来管理ViewModel的生命周期。...ViewModel与SavedState 有时,我们可能希望在ViewModel中保存一些与UI控制器生命周期无关的数据,以便在重建时恢复状态。
简单理解就是,ViewModel为UI层提供数据。官方文档定义如下: ViewModel 以注重生命周期的方式存储和管理界面相关的数据。...1.2 特点 具体地,相比于Presenter,ViewModel有以下特点: 1.2.1 生命周期长于Activity ViewModel最重要的特点是 生命周期长于Activity。...每个 Fragment 都有自己的生命周期,而不受另一个 Fragment 的生命周期的影响。如果一个 Fragment 替换另一个 Fragment,界面将继续工作而没有任何问题。...继续见名知意:ViewModelStoreOwner——ViewModel存储器拥有者;ViewModelStore——ViewModel存储器,用来存ViewModel的地方;Factory——创建ViewModel...4.1 使用场景 在我很久之前一篇文章《Activity生命周期》中有提到: onSaveInstanceState调用时机: 当某个activity变得“容易”被系统销毁时,该activity的onSaveInstanceState
前言 作为MVVM 系列的第二篇,我们来看一下之前提出的第二个问题,就是ViewModel是如果控制生命周期的,并且保证在一定范围内的唯一性。...简单看一下,代码不难理解,先赋值成员变量,之后是查看ViewModelStore中是否有传入类型的ViewModel,没有的话就通过传入的工厂类创建一个新的ViewModel 添加到ViewModelStore...这样ViewModel的实现过程就差不多结束了,还是利用Fragment的方式去获取生命周期,然后再利用工厂类来创建ViewModel。...总结 同样使用的给宿主添加Fragment的方式来获取宿主的生命周期,只不过现在只获取销毁的函数就可以。...然后在HoldFragment中持有一个集合用于保存当前宿主的ViewModel,在onDestory函数中调用集合的clear方法,间接调用到ViewModel的onCleared方法,实现生命周期的控制
同样也是以HashMap的形式来保存ViewModel。...回过头来再看ViewModelStore,同样也有一个clear()方法,同样循环调用vm.clear()。 继续追踪ViewModelStore的clear()方法是在哪调用的。...在生命周期为onDestroy的时候,获取ViewModelStore,并调用其clear()方法。...首先在创建ViewModel的时候,会通过ViewModelStore以HashMap的形式把ViewModel保存起来; 随后我们在调用viewModelScope的时候,会在ViewModel中以HashMap...; 在ViewModelStore中也有个clear()方法,会循环调用ViewModel中的clear()方法; 而ViewModelStore中的clear()方法,是由Lifecycle在生命周期执行到
传统实现方法2:数据对象SingleInstance、static 缺点: 数据的生命周期要自行控制; 容易内存泄漏; 同样麻烦,且有一定风险。...; 使用HolderFragment持有的ViewModelStore对象完成ViewModelProvider的创建; 第一部分的职责是构建 / 查找HolderFragment,对构建过程中的异常做保护...看到官方文档中的这句话,心想ViewModel莫非是通过同为官方架构组件的Lifecycle来管理的生命周期的?...其实并没有那么复杂,ViewModel在第一次调用ViewModelProvider.get(ViewModel.class)创建;而销毁就需要靠HolderFragment自己的onDestroy()...这也解释了创建ViewModelProvider时为什么需要HolderFragment配合,HolderFragment掌控了ViewModel的生命周期。
ViewModel类是被设计用来以可感知生命周期的方式存储和管理 UI 相关数据,ViewModel中数据会一直存活即使 activity configuration发生变化。...ViewModel 生命周期是贯穿整个 activity 生命周期,包括 Activity 因旋转造成的重创建,直到 Activity 真正意义上销毁后才会结束。...我之前的做法是接口回调,需要统一在 Activity 里管理,并且不可避免的 fragment 之间还得互相持有对方的引用。...至此ViewModelProviders of 做了哪些事情呢: 1、初始化了ViewModelProvider内部维护了 用于创建 VM 的 Factory,和用户存放 VM 的ViewModelStore...Google 的 lifecycle 与 ViewModel 全都是利用 fragment 的一些特性去玩这些生命周期.
如果看过我上一篇文章的小伙伴应该都有所了解,ViewModel是MVVM架构的一个层级,用来联系View和model之间的关系。而我们今天要说的就是官方出的一个框架——ViewModel。...“ViewModel 类旨在以注重生命周期的方式存储和管理界面相关的数据 ” 官方是这么介绍的,这里面有两个信息: 注重生命周期的方式。...在ViewModel组件被设计出来之前,MVVM又是怎么实现ViewModel这一层级的呢? 其实就是自己编写类,然后通过接口,内部依赖实现View和数据的双向绑定。...然后实例创建出来会保存到一个ViewModelStore容器里面,其实也就是一个集合类,这个ViewModelStore 类其实就是保存在界面上的那个实例,而我们的ViewModel就是里面的一个集合类的子元素...最后在界面销毁的时候,会去执行ViewModelStore的clear方法,去清除集合里面的ViewModel数据。
ViewModel生命周期 ViewModel的源码分析 什么是ViewModelStore 什么是ViewModelStoreOwner 如何简化Fragment之间的通信 ViewModel 的生命周期...} 此时,ViewModel 就创建好了,那 VIewModel 是如何被创建的呢,mFactory 的具体实现这里是默认的 AndroidViewModelFactory,其创建时通过反射获取构造方法创建的...什么是 ViewModelStore ViewModelStore 主要是用来保存当设备配置发生变化的时候保存 ViewModel 的状态,如当前界面被重新创建或者销毁等,对应的新的 ViewModelStore...记住一点,使用 ViewModel 进行两个 Fragment 之间通信的时候,创建 ViewModel 使用其宿主 Activity 来创建,实现过程如下,首先创建一个 ViewModel 如下: public...每个 Fragment 都有自己的生命周期,可以随意替换和移除都不会互相影响另一个 Fragment 的正常工作。
ViewModel 被设计来管理跟 UI 相关的数据, 并且能够感知生命周期;另外 ViewModel 能够在配置改变的情况下让数据得以保留。...ViewModel 的生命周期 我们在前面提到过,ViewModel 并不会因为 Activity 的配置改变销毁而一起销毁,那么 ViewModel 的生命周期到底是怎么样的呢?...都构建了一个唯一的 key , 并通过这个 key 尝试去一个叫做 ViewModelStore 的类获取 ViewModel 的实例,如果为null ,那么会通过 Factory 去创建,并把新的实例存入到...再仔细思考一下,get 方法会优先从这个 ViewModelStore 中去拿,那么理论上只要保证 ViewModelStore 这个类在配置变化的过程中没有被销毁,那么就可以保证我们创建的 ViewModel...这里传入了一个 通过 ViewModelStores 类创建的 ViewModelStore,并且传入了 fragment,一定有蹊跷。
一、MVVM 之初体验 网上关于 MVVM 的介绍非常多,这里不再赘述,直接看一个例子,用直观的代码来感受一下用 MVVM 开发,是一种什么样的感受 class MvvmViewModel : ViewModel...答案肯定是否定的,但是 Android 给我提供了一套组件,可以让我们更方便地用 MVVM 模式来开发,减少我们重复造轮子的工作量 ViewModel ViewModel 是官方提供的,用于管理 UI...在 MVVM 中,ViewModel 充当 View 和 Model 之前数据中转和逻辑处理的角色 image.png ViewModel 的生命周期 ViewModel 的生命周期和创建 ViewModel...ViewModel 实例化传参 有时候我们希望给创建的 ViewModel 传递参数,这里分场景看一下: 在 Fragment 或者 Activity 中使用 ViewModel 注意事项 通过 ViewModelProvider...,如果要使用 LiveData 来实现非粘性消息(observe() 的时候不接收之前赋给 LiveData 的值),有各种 workaround 的方式,具体可以移步至我的另一篇文章:LiveData
Jetpack为我们提供了ViewModel组件帮我们解决这个问题,ViewModel以注重生命周期的方式存储和管理界面相关的数据。...ViewModel独立于配置变化,就算Activity重建,也不会影响ViewModel的生命周期。...ViewModel与onSaveInstanceState() 通常我们使用onSaveInstanceState()来解决屏幕旋转带来的数据丢失问题,但是它只能保存少量的支持序列化的数据,Viewmodel...的实例化是通过ViewModelProvider来完成的,它会判断ViewModel是否存在,若存在直接返回,不存在则创建。...要传递Context对象,可以使用AndroidViewModel类,它继承自ViewModel,并接收Application作为Context,因此它的生命周期和应用Application的生命周期一样
ViewModel2.0之前 利用一个无view 的HolderFragment来维持它的生命周期,我们知道ViewModel实例是存储到一个ViewModelStore容器里的,那么这个空的fragment...总结来说就是用一个空的fragment来管理维护ViewModelStore,然后对应的activity销毁的时候就去把viewmodel的映射删除。...就让ViewModel的生命周期保持和Activity一样了。这也是很多三方库用到的巧妙方法,比如Glide,也是建立空的Fragment来管理。...ViewModel,也就是调用ViewModelStore的clear方法。...所以,到这里,第三个问题应该也可以回答了,2.0之前呢,都是通过他们创建了一个空的fragment,然后跟随这个fragment的生命周期。
ViewModel处于数据逻辑层,他的生命周期贯穿整个宿主,如act因屏幕旋转销毁重建时,其依然存活,只有act.finish后,才会自动销毁,因此可以用他来维持宿主的数据状态。...现在比较流行的方式是把他当做唯一数据源来驱动UI展示: view层:view (act / fragment) 数据逻辑层:viewModel 数据源:repository (db / network...== null) { //act第一次创建时,在这里创建了ViewModelStore mViewModelStore = new ViewModelStore...销毁时,借助ActivityClientRcord来间接保存viewModelStore;Activity重建时,从ActivityClientRcord中间接取出viewModelStore。...getViewModelStore().clear(); } } } }); } 关于Lifecycles,可以阅读我的早些的笔记
关于 ViewModel 的生命周期,具体如下图所示: 虽然 ViewModel 非常好用,但 ViewModel 也不是万能,其只能避免配置变更时避免状态丢失。...而 ViewModelStore 是负责维护我们 ViewModel 实例的具体类,内部有一个 map 的合集,用于保存我们创建的所有 ViewModel ,并对外提供了 clear() 方法,以 便于非配置变更时清除缓存...如果当前已创建,则直接使用;反之则调用我们的 ViewModel工厂 create() 方法创建新的 ViewModel。 创建完成后,并将其保存到 ViewModelStore 中。...我们的插入点也就在于此开始。 我们暂时先不关注如何还原状态,而是先搞清楚 SavedStateRegistry 是什么,它又是从哪来而传递来的。...即 SavedStateRegistry 的创造以及状态的保存,肯定也是 经过我们Activity转发处理(不然它自己怎么处理呢)。
大家好,我是稳稳,一个曾经励志用技术改变世界,现在为随时失业做准备的中年奶爸程序员,与你分享生活和学习的点滴。 连续熬夜真是吃不消啊!加油!加油! 引言:为什么开发者需要ViewModel?...而ViewModel的诞生,通过“生命周期穿透”能力,彻底解决了配置变更导致的数据丢失问题。 但它的实现原理究竟是什么?本文将揭开其底层三大黑科技。...这个Fragment的setRetainInstance(true)属性,使其在Activity重建时仍存活于内存中,其内部通过ViewModelStore对象缓存所有ViewModel实例。...()),而Bundle仅在临时重建时有效 性能对比:ViewModel通过内存缓存避免序列化开销,性能提升约30倍 Q2:如何实现自定义生命周期的ViewModel?...跨屏幕旋转:HolderFragment + ViewModelStore机制 2. 跨组件通信:ViewModelStoreOwner的多级作用域控制 3.
1.什么是ViewModel 具备宿主生命周期感知能力的数据存储组件 ViewModel保存的数据,在页面因 配置变更导致页面销毁 重建之后依然是存在的 配置变更:横竖屏切换、分辨率调整、权限变更、系统字体样式变更...); ViewModelProvider本质是从传递进去的ViewModelStore来获取实例,如果没有,则利用factory去创建 3.1 ViewModelProvider的创建 public class...> T create(@NonNull Class modelClass); } 就是说,当我们来获取ViewModel实例的时候,如果在ViewModelStore中获取不到,就会用Factory...= null) { // TODO: log a warning. } } //3.如果不是就通过工厂来创建一个viewModel...作为Key, 这就是在ViewModelStore中存储的Key,Value是我们的ViewModel的.class对象 我们知道了ViewModel是从ViewModelStore中获取的,那既然想做到
领取专属 10元无门槛券
手把手带您无忧上云