神刀安全网

架构组件之–ViewModel

前言:这是自己的的第一篇文章,希望可以把自己所学到的东西都能总结并分享出来,希望可以做好。


一、简介

    2017Google I/O大会上google引入了lifeCycle组件,说来惭愧,最近才来使用,这也是自己之前的问题所在,对一些新的技术没有给予足够的重视。

    回归正题,为什么要使用呢?

    lifeCycle,顾名思义,与生命周期相关,我想做Android开发的同学不免会遇到一些问题,比如内存泄漏,又或者比如生命周期重建后数据的恢复等等,使用lifeCycle都可以解决你的问题。我个人有一个习惯,就是习惯看源码,与其看网上所说的一些优点,都不如源码来的直接一些。

二、分析

    首先我们引入相关库,具体可见Android Architecture Components,我们找到ViewModel的代码

先来看上面这段类注释,写的非常多,我截取了其中一部分,简要描述下,里面主要说了几个点:

架构组件之--ViewModel

1、是为Activity或Fragment处理数据的

2、直到Activity/Fragment消失之前,数据都会存在

3、强调了下viewModel里面不能对Activity/Fragment有引用,这一点根据第二点也可以猜到。

4、里面提到了LiveData,也是组件之一,后续会进行讲解。

5、里面提到了创建的方法,使用ViewModelProviders(这个类在extensions包下,不在viewModel中),下面会说到。

架构组件之--ViewModel

    上面代码非常简单,一个抽象类和一个空实现的方法,很明显是在做清理的动作。在上面说,使用ViewMOdelProviders进行创建,看到里面的代码,是使用ViewMOdelProvider使用工厂模式进行创建,注意我上面提到的两个类,一个带s一个没有,不是同一个(一般带s的是不带s的工具类),就不贴代码了。

    既然是跟Activity/Fragment的生命周期相关,那我们去这里看看是怎么使用的。

架构组件之--ViewModel

我们打开Fragment的代码,发现实现了一个叫ViewMidelStoreOwner的接口,里面有一个叫getViewModelStore()的方法,返回的是一个ViewModelStore类型的对象,这个对象里面有一个存储viewModel的map,代码很简单,不贴了。在Fragment的使用也很简单,就是在onDestroy()的时候调用了viewModel的clear()方法。

问题来了,从上面的代码看,并没有地方做全局的数据存储,那么是如何做到activity/fragment重建的时候数据恢复呢?其实还是有在做静态存储的。我们看下面。

架构组件之--ViewModel

架构组件之--ViewModel

架构组件之--ViewModel

    连续贴了三段代码,我们可以发现,是在一个叫 HorderFragment的类中做了静态存储,以一个fragment/Activity作为key。不知道有没有小伙伴看到这里可以想到一点,就是ViewModel可以作为fragment直接的数据共享。很简单,只要创建的时候key都使用activity即可。

架构组件之--ViewModel

ViewModel生命周期

    这里我们又贴了一张图,可以更直观的看到ViewModel的生命周期。

三、总结

    最后我们总结下,ViewModel的好处:

1、与生命周期相关,避免使用不当造成内存泄漏。

2、在Activity/Fragment重建的时候可以进行数据恢复。

3、可以简单的实现Fragment中的数据共享。

    当然,我们也要注意,切记不可对Activity/Fragment进行引用,不然会造成泄露,如果需要使用context,可以使用AndroidViewModel类,逻辑也很简单,就是创建的时候使用Application作为参数,不多讲了。

    ViewModel一般会结合LiveData进行使用,下篇文章我们来分析下LiveData。

    以上。


    自己的第一篇文章,可能有的点写的不是很好,如果大家有什么建议或者意见的话,欢迎大家评论!

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » 架构组件之–ViewModel

分享到:更多 ()