1.Android Jetpack的定义
2.ViewModel的定义
3.ViewModel的简单应用实例
4.Activity、Fragment中的常见的坑
5.使用ViewModel的好处
6.ViewModel与LiveData和Data Binding互相搭配使用
7.使用的注意事项
1.Android Jetpack的定义
Android Jetpack——包含了开发库、工具、以及最佳实践指南。
2.ViewModel的定义
ViewModel——是用来保存应用UI数据的类,它会在配置变更(即Configuration Change)后继续存在。
3.ViewModel的简单应用实例
让我们来看看它具体的特点吧。手机屏幕旋转当旋转屏幕时是Configuration Change的一种,当旋转屏幕时,Activity会被重新创建,如果数据没有被正确的保存和恢复,就有可能丢失,从而导致莫名其妙的UI错误或者应用崩溃,相反的ViewModel会在Configuration Change后继续存在。
在此,我们推荐这样的架构设计,将应用所有的UI数据保存在中ViewModel中而不是在Activity中,这样就能确保数据不会受到Configuration Change的影响。
4.Activity、Fragment中的常见的坑
Android开发一个常见的坑是把很多的变量逻辑和数据摆放在Activity、Fragment中的代码就比较混乱和难以维护。这种开发模式违反了单一责任的原则。
5.使用ViewModel的好处
ViewModel可以有效的划分责任,具体的它可以用来保存Activity里的所有UI数据,然后Activity仅负责了解如何在屏幕上显示该数据和接受用户互动,但是他不会处理这些互动,如果你的应用加载和存储数据,我建议创建一个Repository的存储类,另外,你应确保ViewModel不会因为承担过多责任而变得臃肿,要避免这种情况可以创建Presenter类或者实现一种更成熟的架构。
要创建一个ViewModel,首先需要扩展ViewModel类然后将Activity中之前与UI相关的实例变量摆放ViewModel中。接着,在Activity的onCreate中从ViewModel Provider的框架实用类再获取ViewModel,请注意:这种机制让你可以旋转屏幕,获取一个新的Activity实例,不过,请确保它始终与同一个ViewModel关联,对于ViewModel实例,你可以使用一个get函数从Activity直接获取UI数据,ViewModel默认构造函数是没有任何参数的,如果你想要修改,可以使用ViewModel.Factory创建一个自定义构造函数。
6.ViewModel与LiveData和Data Binding互相搭配使用
刚才我们看到的是ViewModel最简单的用例,不过ViewModel类也可以很好地与LiveData、和Data Binding互相搭配使用,使用ViewModel和LiveData,你可以创建反应式界面,也就是说当底层数据被更新时,UI也会相应的自动更新。
我们假设你的ViewModel包含LiveData,可以像平常一样用Data Binding来绑定数据,在这示例XML文件中,包含了你的ViewModel数据绑定布局和变量标记,然后在你的Activity或Fragment中将XML中使用的变量绑定关联,好像我们这里看到的代码,其中一行最重要的代码是Set Lifecycle Owner当视图在屏幕上可见时,这行代码的功能是绑定是每次LiveData数据的更新。
现在你可以直接从XML中的ViewModel引用LiveData字段,当与Binding Adapter用在一起时。你就可以在Activity中省去大量的样板代码逻辑,请注意:这功能需要Android Studio3.1以上的版本,因此请确保使用正确的版本,还有查阅LiveData文档了解详情,最后,我将介绍一些最佳实践,第一点任何时候你都不应将Context传入ViewModel,也就是说,Fragment、Activity和View都不能被传入,正如我们之前看到的一样,ViewModel可以比相联的Activity和Fragment的生命周期为长。我们假设你在存储了一个Activity,那么当你旋转屏幕时,那Activity将被销毁,但是ViewModel还存着已经被销毁的引用,这种情况就是一种内存泄漏。
7.使用的注意事项
第一点、值得注意的地方,如果你需要一个ViewModel的生命周期长的Application类,你可以使用AndroidViewModel子类,通过这个子类,你就可以直接使用Application的引用了。
第二点、提示,ViewModel不应取代onSaveInstanceState的使用,他们俩是相辅相成的,当进程被关闭时,ViewModel将被销毁,但是onSaveInstanceState不会受到影响,另外,ViewModel可以用来存储大量数据,而onSaveInstanceState就只可以用来储存有限的数据了。尽可能多一点往ViewModel内的存储,以便在Configuration Change时不需要重新加载或生成数据,另一方面,如果进程被关闭,我们应该用onSaveInstanceState来存储足够还原UI状态的最少数据,比如用户的数据库ID,
希望这个视频能够帮助大家使用ViewModel单独使用或与其他架构组件结合使用都可以,谢谢。
视频下载地址:https://pan.baidu.com/s/1Uf9f27zoKyw_XFSobqMvMg
提取码:ndpz