Android开发Jetpack组件ViewModel如何使用


本篇内容主要讲解“Android开发Jetpack组件ViewModel如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android开发Jetpack组件ViewModel如何使用”吧!学习ViewModel之前首先我们得简单了解下MVP和MVVM,因为ViewModel是MVVM中的免费云主机域名一个元素MVP MVVM在MVP中View想要调用Model数据层,需要经过中间层Presenter, 这样就实现了View和Model的解耦,这也是MVP和MVC的差别; 但是如果一个Activity中有太多交互,那么我们的View接口数量就会很庞大达到十几个也不足为奇,并且在View层调用了Presenter之后,会反过来调用View层,这样显得繁琐;而MVVM的出现就解决了这个问题说到MVVM的话,我们放上Google的架构图MVVM中的VM指的就是ViewModel; 从上图为没看到,因为ViewModel中持有了LiveData,而LiveData是一个可观察的数据类型,在LiveData原理篇中,我们做了详细的分析;在View层中,将被观察的数据LiveData订阅,并提供了一个观察者Observer,当数据发生变化的时候,就会回调Observer中的onChanged()方法,从而更新UI, 这个过程是系统源码帮我们处理的,所以就没有上面Presenter中调用View的那一步了应用的某个 Activity 中可能包含用户列表,因配置更改而重新创建 Activity 后,新 Activity 必须重新提取用户列表; 对于简单的数据,Activity 可以使用onSaveInstanceState() 方法从 onCreate() 中的捆绑包恢复其数据,但此方法仅适合可以序列化再反序列化的少量数据,而不适合数量可能较大的数据,如用户列表或位图,使用ViewModel可以解决这个问题另外,界面控制器经常需要进行异步调用,这些调用可能需要一些时间才能返回结果; 界面控制器需要管理这些调用,并确保系统在其销毁后清理这些调用以避免潜在的内存泄露;此项管理需要大量的维护工作,并且在因配置更改而重新创建对象的情况下,会造成资源的浪费,因为对象可能需要重新发出已经发出过的调用,使用ViewModel可以解决这个问题诸如 Activity 和 Fragment 之类的界面控制器主要用于显示界面数据、对用户操作做出响应或处理操作系统通信(如权限请求); 如果要求界面控制器也负责从数据库或网络加载数据,那么会使类越发膨胀。为界面控制器分配过多的责任可能会导致单个类尝试自己处理应用的所有工作,而不是将工作委托给其他类;以这种方式为界面控制器分配过多的责任也会大大增加测试的难度ViewModel 类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel 类让数据可在发生屏幕旋转等配置更改后继续存在ViewModel的使用比较简单,我们想要使用使用的话直接继承ViewModel或者继承AndroidViewModel即可; AndroidViewModel源码如下,他们俩的区别,是AndroidViewModel中多了一个Application的成员变量以及以Application为参数的构造方法,如果你需要Application的话,就直接继承AndroidViewModel即可这里以我写的一个Demo为例,这个Demo可以在Github上找到,链接如下JetPack Demo,这个Demo用到了所有Jetpack的组件,是学习Jetpack的辅助资料,需要的小伙伴可以下载和star。我们自定义一个AppsViewModel如下:因为我们这里传入了一个参数,所以需要定义一个Factory,代码如下:接下来就是使用了:我们先声明了一个变量viewModel,我们可以通过注释1处的 by viewModels提供一个自定义的Factory,但是需要添加一个依赖:implementation “androidx.fragment:fragment-ktx:1.2.2;或者采用注释2的方式直接使用ViewModelProviders.of(fragment,factory).get(class)的形式获取实例。 然后就直接使用了,在注释3处使用viewmodel.apps.observe将其加入生命周期观察中,如果数据发生变化就会调用Observer的回调,从而更新UI上面我们采用ViewModelProviders.of(...).get(class)方法获取ViewModel,我们就从这里开始源码开始分析,我们先看下这个类的源码:我们看到此类中提供了四个方法,其实着四个都以一样,我们以第四个为例分析;第一个参数是Activity,第二个参数是一个Factory,默认情况下我们是不需要传入Factory这个参数的。如果不传入的话,我们跟进构造方法就能看到默认是用NewInstanceFactory来作为Factory的,看到内部的create方法通过反射生成了一个ViewModel,实例源码如下:如果传入Factory参数的话,就会用我们自定义的Factory作来生成ViewModel。of方法调用结束返回的是ViewModelProvider, 然后调用的是get方法,我们看下这个类的部分源码:上面截取的部分源码其实是ViewModelProvider最重要的方法了,我们先看此类中有两个重要的成员变量,其中一个是mFactory, 注释1处看到如果我们没有传入factory的话,默认实现的是NewInstanceFactory, 印证了我们之前的说法。还有一个是ViewModelStore, 它是怎么来的呢?因为ComponentActivity中实现了接口ViewModelStoreOwner,在ViewModelProvider的构造方法中调用owner.getViewModelStore(),这个owner就是ComponentActivity自身,然后获取到了ViewModelStore这个变量,实际调用的源码如下:在注释1处,判断如果mViewModelStore == null的话,就会调取getLastNonConfigurationInstance尝试获取,如果获取到了就将获取到的赋值给mViewModelStore返回。这里就涉及到一个重要的知识点了,为什么说ViewModel在横竖屏切换的时候能够持久的保存数据,不需要像之前一样调用onSaveInstanceState? 因为在Activity被销毁的时候,还会调用另外一个方法onRetainNonConfigurationInstance, 我们看它在ComponentActivity中的源码实现:我们看到在注释1的地方将我们之前存在的viewModelStore存储到NonConfigurationInstances中了,然后在调用getViewModelStore的时候调用getLastNonConfigurationInstance这样就保证了Activity销毁之前和之后的viewModelStore是同一个,那它里面存储的ViewModel值也就是同样的了。所以ViewModel的生命周期可以用下图来概括:接下来我们分析get方法:首先获取类的全称的字符串名字,和DEFAULT_KEY拼凑成一个Key,然后调用get的重载方法如下:注释1处判断我们的modelClass是不是属于ViewModel类型的,并且判断mFactory的类型是否属于OnRequeryFactory类型,如果是的话,就返回值; 在注释2处使用Factory通过反射创建一个viewModel, 然后将其存入mViewModelStore中。我们看下ViewModelStore的源码:ViewModelStore的源码很简单,内部持有了一个HashMap对象,用来存放ViewModel。ViewModel的创建到此就结束了。然后就是使用的问题, 使用如下到此,相信大家对“Android开发Jetpack组件ViewModel如何使用”有了更深的了解,不妨来实际操作一番吧!这里是百云主机网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

相关推荐: css如何设置边框线

本篇内容主要讲解“css如何设置边框线”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“css如何设置边框线”吧!边框样式border-style属性是用在设置元素所有边框的样式,或是单独地设置各边框样式。我们设置边框…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 03/28 16:20
Next 03/28 16:20

相关推荐