手撕Android Jetpack LifeCycle ,LiveData和ViewModel -ViewModel篇

539 阅读3分钟

ViewModel的作用是什么

      官方的说法就是管理UI的数据,在MVVM中比较重要的一个角色吧,链接View和Model的一个桥梁,同时在屏幕旋转等一些配置改变的时候,会保存相关的UI数据,在UI恢复的时候可以还原界面的元素,当然传统的Activity的OnSaveInstanceState()和onCreate()的bundle也是可以去实现,但是传统的方法有一些限制,只是适合序列化和反序列化的一些数据,和一些比较小的数据,不适合大的数据,比如位图这些,而ViewModel是可以的,那么ViewModel怎么存储的,ViewModel是怎么生成的,ViewModel怎么做到在屏幕发生旋转的时候恢复数据的?这些在分析之后就知道了。

ViewModel的生命周期

在OnDestory()的时候ViewModelStore会调用OnClear(),进而调用ViewModel的onCleared()方法。

ViewModel和AndroidViewModel

     ViewModel是个抽象类,声明了一个方法onCleared()

     AndroidViewModel继承了ViewModel,构造方法传入了Appplication,主要的目的就是为了可以调用Android的一些系统服务,和提供ViewModel一个上下文的环境,

ViewModel的存储

          ViewModelStore,主要用来存储ViewModel,主要是一个HashMap,这个类有三个方法一个是

     1.put(String key,ViewModel viewmodel),每次put的时候,如果已经存在了这个model,会把旧的model拿出来,主动调用onCleared()。

     2.get(String key),从map中获取ViewModel

     3.onCleared(),会遍历Map中的集合调用OnCleared()

ViewModelStoreOwner,是一个接口,有一个方法,getViewModelStore,主要是返回存储ViewModel的一个对象,ViewModelStore

ViewModel的实例化

     分析在Actiivity中的ViewModel的实例化,比如,ViewModelProviders.of(Activity avtivity).get(Model.class),

    1.ViewModelProviders.of(this)

      如果没有指定一个工厂类的话,该方法会实例化一个ViewModel的工厂类,

AndroidViewModelFactory,主要用来生成一个ViewModel,无论你的ViewModel是继承的是AndroidViewModel还是ViewModel,都会调用反射来生成相关的实例。

   有了工厂类,就用来构造ViewModelProvider,并返回ViewModelProvider,这个ViewModelProvider的构造传入了ViewStoreOwner和工厂类,第一个就是可以通过接口获取ViewModelStore,也就是存储ViewModel的地方,工厂类只要是为了生成ViewModel。

  2.ViewModelProvider.get(yourViewModel)

   这个方法,会拿ViewModel的类名拼上一个定义好的前缀去ViewModelStore里面去查找这个ViewModel,如果有这个实例就返回改ViewModel的实例

如果没有,就会调用mFratory.create当前的这个类,并放入ViewModelStore中。

ViewModel怎么做到在屏幕旋转的时候维持DATA的?

     这里要一点Activity的启动流程的知识了,在Activity调用performDestoryActivity()的时候,会给相应的ActivityClientRecord中的lastNonConfigurationInstances赋值,赋值的NonConfigurationInstance这个值就保存了相应的ViewModelStore了。在handlerLuanchActivity的时候,activity.attach的时候,恢复NonConfigurationInstance的值。

用自己的话总结就是这个样子了,有兴趣的话可以去看看相对应的源码。

最后

   写的博客大多是为了巩固自己看过源码后的一些知识,有啥不对的,或者有疑问的欢迎各位大佬评论一起讨论讨论