架构组件之--ViewModel

作者: 墨迹_T | 来源:发表于2018-05-27 21:57 被阅读69次

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


    一、简介

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

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

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

    二、分析

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

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

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

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

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

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

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

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

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

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

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

    ViewModel生命周期

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

    三、总结

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

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

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

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

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

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

        以上。


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

    相关文章

      网友评论

        本文标题:架构组件之--ViewModel

        本文链接:https://www.haomeiwen.com/subject/dcsijftx.html