• Mvvm中的Lifecycle


    lifecycle:一个持有activity/fragment生命周期信息的类,允许其他对象观察此对状态

    Event:从框架和lifecycle类派发的生命周期事件,也就是activity和fragment的各个状态会发Event

    state:这个就好理解了,就是activity和fragment当前的状态

    LifecycleOwner: 我的理解这是一个被观察者接口,他持有一个lifecycle,这个lifecycle就是被观察者中的事件,观察者想观察的事件,就是lifecycle的状态

    在lifecycle抽象类中,定义了抽象方法,addOberrver和removeObserver,这是经典的被观察者

    再回到lifecycleOwner的源码中

     看,其实就是一个接口,一个获取lifecycle对象的方法

    那么到这里,就知道了,只要实现了lifecycleOwner接口的对象,都会持有一个lifecycle的对象,那么实际上,lifecycleOwner本没有添加观察者的能力,添加观察者实际是在lifecycle对象中实现的

    lifecycleOberver:前面被观察者找到了,那么观察者也应该现身了,就是他,也是一个接口,实现该接口的对象,通过注解的方式,被lifecycleOwner代理被观察者注册为观察者,此后就能观察到lifecycle的状态改变

    从上面lifecycle的源码中可以看到,addOberver(LifecycleOberver oberver),添加的观察者就是LifecycleOberver

    更简洁了,就是一个接口,也就是说实现了这个接口的类,就可以是lifecycle的观察者

     --------------------------------------------------------------------------------------------------------------------------------

    我们来到Mvvm中

    看看创建的BaseViewModel

     继承了ViewModel抽象类,并实现了DefaultLifecycleObserver,不言而喻这里我们的BaseTestViewModel变成了一个实现了LifecycleObserver的观察者,并且我们可以重写onCreate获得被观察者,这个onCreate()来自哪里呢

    来自

     写的很明白了,当lifecycle的生命周期发生变换的时候,这些方法就会执行,那么此时我们是不是就变成了有生命周期感知了,那么我们继续追踪lifecycleOwner的来源

    我们要使用的viewModel,继承自我们的BaseTestViewModel

     这里插一段仓库层,也就是网络请求层,为了让仓库层也能感应生命周期的变化,我们需要做一些操作赋予它生命周期的感应功能

    新建一个接口

    这个接口就定义两个函数,onCreate()和onDestory(),参数就是被观察者,参数肯定是被观察者,因为我们要感知生命周期,那生命周期肯定就是被观察者的啊

    写一个基类仓库层,实现接口

     这样写的好处是可以在基类做一些其他的事情

    来到我们实际的仓库层

     在实际的仓库层中,我们就能获得生命周期被观察者LifecycleOwner,那么这里是获取到,获取的是谁呢?

    我们回到刚刚的MainViewModel中,我们创建一个仓库层的对象,在MainViewModel的onCrate中调用仓库层的onCreate(),因为viewModel的onCreate是被观察者lifecycle的ON_START事件的回调,那么此时我们的仓库层,也就是拥有了生命周期被观察者,且我们仓库层和被观察者的ON_START事件和ON_DESTORY事件同步上了

    到现在我们还没找到LifecycleOwner从哪里传来的呢?继续追踪

    我们的MainViewModel是和自己的Activity绑定的,绑定在哪里执行呢,在我们封装的BaseActivity中,我们在这创建了viewModel,然后呢,直接给它注册到被观察者里面去啊!!

     

     我们追踪Activity的继承关系,发现在ComponetActivity类中实现了LifecycleOwner和ViewModelStoreOwner接口

    那么我们就发现了原来Activity就是一个被观察者啊,fragment同理啊,这俩原来早就实现了LifecycleOwner接口,都是被观察者啊

    接下来我们来到关键的一行

    1. /**
    2. * 到这里就很明显了,追踪Activity的继承关系,会发现activity实现了一个接口“LifecycleOwner”,还记得不,这个被观察者的接口,只要实现了这个接口的类都是持有lifecycle的被观察者
    3. * ViewModelProvider 这里是不是就是将被观察者owner注册观察者呢
    4. */
    5. mViewModel = new ViewModelProvider(this,new ViewModelProvider.NewInstanceFactory()).get(vmClass);

    来到ViewModelProvider中

     

     创建ViewModelProvider,它将通过给定的工厂创建viewmodel,并将它们保留在给定的ViewModelStoreOwner的存储中。

    来到ViewModelStoreOwner,这个东西好像在哪见过,没错就是ComponetActivity中实现了这个接口,那也就是说activity就是一个ViewModelStoreOwner了

     继续追踪到ViewModelStore

     就是viewModel的管理,获取类,也就是说实现了ViewModelStoreOwner接口的类,都会有一个map用来管理viewModel

    我们继续看ViewModelProvider的get(class)

     也就是根据class的名称和class来找viewModel,找不到就创建viewModel,并且存到viewModelStore中,也就是创建的时候就会存到viewModelStore中去,viewModelStore中有get、put、clear方法,clear方法就是清空viewModel,看看调用的地方

    有两个地方调用了一个是经典的ComponentActivity,一个是FragmentManagerViewModel中

    一追踪就很明显能看到都是在ON_DESTORY的时候才会调用,也就是说,viewModel自创建后,只有在页面销毁的时候才会被clear掉,不然会一直存在。 也就是说viewModel的生命周期就是activity的创建到销毁

  • 相关阅读:
    Nacos服务发现与注册中心之服务消费(发现)者(客户端源码)
    使用Eclipse创建一个简单的servlet项目
    [开源]研发管理项目,支持从需求到代码发布全过程全生命周期管理
    【微服务实战系列】 nacos作为注册中心使用
    使用ldapadd,ldapmodify,slapcat 进行数据增加,备份,导入导出数据
    常用类05:String类(面试中用的最多)
    2022年9月8号Java23设计模式(课时七)桥接模式
    [激光原理与应用-109]:南京科耐激光-激光焊接-焊中检测-智能制程监测系统IPM介绍 - 12 - 焊接工艺之影响焊接效果的因素
    BIM+物联网,打开数字孪生世界之门
    Yolov5+图像分割+百度AI接口——车牌实时检测识别系统
  • 原文地址:https://blog.csdn.net/somethingstill/article/details/127902707