首页
学习
活动
专区
圈层
工具
发布

ViewModel 和 ViewModelProvider.Factory:ViewModel 的创建者

ViewModelProviders 在内部为我们管理并调用 ViewModel 的主构造函数,创建viewmodel的实例并将该实例并返回。...这是由于你在实例化 ViewModel 对象时,不能直接在活动或者碎片中调用 ViewModel 的构造方法,而且你又想去设置 ViewModel 构造方法的参数,因此你需要将参数传入 ViewModelProvider.Factory...它将会帮你创建你的 ViewModel。...系统自带的方法,注意帮助你创建 ViewModel。 总结 ViewModelProvider.Factory 负责帮你创建 ViewModel 实例。...当你的 ViewModel 存在依赖项,且你希望测试你的 ViewModel 时,你需要创建自己的 ViewModelProvider.Factory 来通过 ViewModel 的构造方法传递依赖项,

2.2K20

ViewModel

幸运的是,ViewModel可以为我们解决这个问题。...ViewModel独立于配置变化,这意味着,屏幕旋转所导致的Activity重建,并不会影响ViewModel的生命周期,如下图所示: 三.ViewModel的基本使用方法   前面提到,ViewModel...ViewModel的实例化过程是通过ViewModelProvider来完成的,ViewModelProvider会判断ViewModel是否存在,若存在的话直接返回,否则他会创建一个ViewModel...四.ViewModel和AndroidViewModel   前面提到,ViewModel是独立于配置变化的,它的生命周期比页面长,所以需要注意的一点是:不要向ViewModel传入任何类型的Context...但是要注意,onSaveInstanceState()方法只能存储少量的,能支持序列化的数据,而ViewModel没有这个限制,ViewModel支持页面中的所有数据。

50530
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Jetpack:ViewModel

    1.引入背景 引入ViewModel之前,存在如下几个问题: (1)有的时候一个Activity里面嵌套了多个fragment,但是这些fragment里面用的是同一个数据,为了同步这些数据,我们需要用接口来传参...(2)屏幕旋转,会销毁重建,如果数据类型比较简单,同时数据量也不大,可以通过onSaveInstanceState()存储数据.但如果是大量数据,不方便序列化及反序列化,则上述方法将不适用. 2.ViewModel...的使用 (1)gradle中引入 implementation 'android.arch.lifecycle:extensions:1.1.1' (2)新建ViewModel实体类 public class...UserModel extends ViewModel { String name; int age; } (3)获取ViewModel UserModel model = ViewModelProviders.of...ViewModelStoreOwner,就返回ViewModelStore,否则就新生成一个HolderFragment来获取ViewModelStore 那就进去看看HolderFragment如何实现ViewModelStore的(

    85120

    Android Jetpack - ViewModel

    ViewModel 简述 ViewModel 旨在以生命周期感知的形式存储和管理 UI 控制器(Activity/Fragment 等)相关的数据,可以解决 UI 控制器中数据无法正确保留以及数据在其复杂的生命周期中难以维护的痛点...,你可以看到一个 Activity 旋转过程的生命周期,绿色部分是与此 Activity 相关联的 ViewModel 的生命周期,图例中只展示了 Activity ,而 ViewModel 也同样可以和...我用一个非常简单的 Demo 来展示它的基础用法,通常我们为 app 集成 ViewModel 遵循如下几个步骤: 1、创建一个继承 ViewModel 的类来分离出 UI 控制器中的数据 2、建立 ViewModel...中持有任何 Activity、Fragment 或 View 的引用,因为大部分情况 ViewModel 的生命周期比它们都长,持有一个已经销毁对象的引用意味着内存泄露,对于必须使用 Context 的...ViewModel 结合 LiveData ViewModel 如果不结合 LiveData 来用的话就失去了它的灵魂,正如人与人之间的默契配合才能发挥出整个团队的潜能,架构组件本着开放灵活的原则,允许你单独集成使用它们其中的任何一个

    1.2K20

    Jetpack系列——ViewModel

    Jetpack为开发者提供了ViewModel的概念,将页面所需要的数据从V层和M层中剥离出来,ViewModel是介于View层和Model层的一个桥梁,使得视图和数据即区分开来,又能保持联系。...ViewModel独立于组件的配置的变化,也就是说,当发生特殊情况导致Activity重新执行某些生命周期时,ViewModel的生命周期并不会发生变化。...下图是ViewModel与Activity的生命周期的对应关系: [1240] 从上图可以看出,ViewModel会伴随着Activity的整个生命周期,直到Activity执行onDestroy()方法之后...其他 需要注意的是,正是由于ViewModel脱离于Activity的生命周期,不建议向ViewModel中传入Context引用,以避免发生内存泄漏。...,但当页面被彻底销毁时,ViewModel中的数据也就不复存在了。

    84410

    LiveData beyond the ViewModel

    LiveData被设计用来实现观察者模式,允许视图控制器(Activity、Fragment等)和UI数据的来源(通常是ViewModel)之间进行通信。...通过LiveData,这种通信更加安全:由于它的生命周期意识,数据只有在View处于Activity状态时才会被接收。 简而言之,其优点是你不需要在View和ViewModel之间手动取消订阅。...img LiveData beyond the ViewModel 可观察范式在视图控制器和ViewModel之间工作得非常好,所以你可以用它来观察你的应用程序的其他组件,并利用生命周期意识的优势。...每当资源库有新的数据时,ViewModel只需对其进行映射即可。...img 你不能在ViewModel的初始化中创建它们,因为用户ID不是立即可用的。你可以用switchMap来实现这一点。

    2K30

    JetPack组件学习ViewModel

    ViewModel的使用 1.需要先创建ViewModel类,继承自ViewModel重写onclear方法,使得页面销毁的时候能够走到自定义的onClear方法中 class MyViewModel...该工厂默认实现是获取get函数传入的class反射创建ViewModel实例;也可以自定义工厂函数,会接受一个class的参数只需要返回该实例即可,中间的操作可以自定义 一,传入ViewModelOwner...上面是利用反射创建了一个带有参数的ViewModel。默认创建的是无参的实例 3.通过get传入对应的Viewmodel的Class对象即可。...就可以获取到了,而且Store是保存着这个页面的所有Viewmodel所以上一次的ViewModel中的数据还在并没有销毁 详细流程: HandlerRelauncherActivity中先调用handlerdestory...但是ViewModel是系统原生支持的我们可以直接获取到上次销毁的ViewModel实例数据还在其中 3.具有生命周期可以自动管理防止泄漏,可通过onCleared告知持有该ViewModel的V层销毁

    80910

    由浅入深,详解ViewModel的那些事

    而 ViewModel 作为 JetPack 核心组件,其本身也更是承担着不可或缺的作用。 因此,了解 ViewModel 的设计思想更是每个应用层开发者必不可缺的基本功。...随着这两年 ViewModel 的逐步迭代,比如 SaveStateHandle 的加入等,ViewModel 也已经不是最初版本的样子。...不过 ViewModel 的源码其实并不是很复杂,所以别担心。 仔细想想,要解析ViewModel的源码,应该从哪里入手呢?...get(ViewModel::xx) 从缓存中获取现有的 ViewModel 或者 反射创建 新的 ViewModel。...结语 在本篇中,我们从 ViewModel 的背景开始,再到 ViewModel 与 SavedStateHandle 的使用方式,最后又从源码层级分析了两者的具体流程,从而较完整的解析了 ViewModel

    1.1K40

    设计模式之责任链模式(Chain of Responsibility)引入责任链模式责任链模式的实例责任链模式的分析责任链模式的应用

    引入责任链模式 责任链模式的实例 责任链模式的分析 责任链模式的优势 责任链模式的应用 引入责任链模式 责任链模式描述的就是如何推卸责任,说的简洁点,就是踢皮球哈哈。...这就是责任链模式的基本思想 责任链模式的实例 实例的类图 ?...如果我们不采取责任链模式,那么请求者就必须要很清楚哪个处理者能处理它的请求,就必须对所有的处理者都有所了解,类似于上帝视角,然而在实际中,要求请求这了解这么多是不实际的 可以动态的改变责任链 责任链还有的好处就是可以动态的改变责任...推卸责任也可能导致处理延迟 我们可以责任链模式需要在责任链上传播责任,直至找到合适的处理对象。这样提高了程序的灵活性,但同时也出现了处理的延迟,因为有一个寻找的过程。...所以需要低延迟的情况下,就不应该使用责任链模式 责任链模式的应用 在视窗系统中,经常会使用到责任链模式,尤其是事件的处理,熟悉javascript开发的朋友,可能会知道,浏览器中的事件有冒泡机制,,就是事件的是向父控件传播的

    1.1K10

    Andorid-JetPack-ViewModel组件

    1.什么是ViewModel 具备宿主生命周期感知能力的数据存储组件 ViewModel保存的数据,在页面因 配置变更导致页面销毁 重建之后依然是存在的 配置变更:横竖屏切换、分辨率调整、权限变更、系统字体样式变更...其实就是ViewModel实例被保存了下来,页面重建之后获取的ViewModel是同一个 2.基本用法 常规用法:存储的数据,仅仅只能当页面因为配置变更导致的销毁再重建时可复用,复用的是ViewModel...ViewModel viewModel = mViewModelStore.get(key); //2.判断viewModel该实例是不是我们传入的modelClass...(T) viewModel; } } 当调用get()方法的时候,我们只是传递了一个ViewModel的.class对象,就会把我们ViewModel的className名字拼接上DEFAULT_KEY...作为Key, 这就是在ViewModelStore中存储的Key,Value是我们的ViewModel的.class对象 我们知道了ViewModel是从ViewModelStore中获取的,那既然想做到

    2K30
    领券