Mvvm中的Lifecycle

news2024/11/16 13:41:21

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接口,都是被观察者啊

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

    /**
         * 到这里就很明显了,追踪Activity的继承关系,会发现activity实现了一个接口“LifecycleOwner”,还记得不,这个被观察者的接口,只要实现了这个接口的类都是持有lifecycle的被观察者
         * ViewModelProvider 这里是不是就是将被观察者owner注册观察者呢
         */
        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的创建到销毁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/12164.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工业互联与MQTT

、工业互联网 新一代信息通信技术与工业经济深度融合的新型基础设施、应用模式和工业生态,通过对人、机、物、系统等的全面连接,构建起覆盖全产业链、全价值链的全新制造和服务体系,为工业乃至产业数字化、网络化、智能化发展提供了实现途径&…

论文阅读-Dr.Deep_基于医疗特征上下文学习的患者健康状态可解释评估

论文地址:Dr.Deep:基于医疗特征上下文学习的患者健康状态可解释评估 (ict.ac.cn) 代码地址:GitHub - Accountable-Machine-Intelligence/Dr.Deep 简介: 深度学习是当前医疗多变量时序数据分析的主流方法。临床辅助决策关乎病人生…

深入浅出Nodejs中的大文件读写

笔者最近在做一些node端的文件读写和分片上传工作,在这个过程中,发现node读取的文件如果超过2G,超过了读取Blob最大值,会出现读取异常,此外在node中读写文件也受服务器RAM的限制等,需要分片读取&#xff0c…

2022年认证杯SPSSPRO杯数学建模A题(第二阶段)人员的紧急疏散求解全过程文档及程序

2022年认证杯SPSSPRO杯数学建模 A题 人员的紧急疏散求解 原题再现: 在过去的几十年里,由于大规模集会活动的数量和规模的增加,紧急疏散的问题变得越来越重要。通过有限宽度的门或狭窄通道进行疏散是最值得关注的情况之一。为了更好地理解各…

.Net Maui 开发之路(1): APP基本设置(图标、应用名称)

.Net Maui APP基本设置(图标、应用名称) 前言一、App显示名称设置二、App显示图标设置三、App加载动画设置四、App透明状态栏设置总结前言 最终实现的显示效果如下图 提示:以下是本篇文章正文内容,下面案例可供参考 一、App显示名称设置 1、在项目上右键,选择编辑项目文…

02 DevOps 之 Jenkins

1. 什么是CICD 推荐阅读:CICD原理及流程 CICD面试题 在要介绍jenkins之前,我们需要了解CICD是什么? Continuous Integration (CI) 持续集成 Continuous Delivery (CD) 持续交付 Continuous Deployment (CD) 持续部署 1.1 持续集成 持续集成…

Echarts折线图隐藏markPoint只显示最大值和最小值的文本,且只在该两点显示symbol

算是一个比较偏门的需求吧,具体UED给的设计图效果如下: 看起来非常简单,但实际实现起来……也确实简单,就是步骤多一点~ 我们知道Echarts提供的markPoint标注最大值和最小值是会有一个水滴图案的: 首先要做的就是隐藏这…

进程状态和优先级【Linux】

1.进程状态的分类 在Linux内核中,进程状态分为七大类,不同的状态有不同的含义。 下面的状态在kernel中定义: /* * The task state array is a strange "bitmap" of * reasons to sleep. Thus "running" is zero, and *…

深度学习笔记--Transformer中position encoding的源码理解与实现

1--源码 import torch import math import numpy as np import torch.nn as nnclass Pos_Embed(nn.Module):def __init__(self, channels, num_frames, num_joints):super().__init__()# 根据帧序和节点序生成位置向量pos_list [] for tk in range(num_frames):for st in ran…

感知机的认识和简单的实现

一、感知机perceptron 1.1 感知机的信号 只有0和1两种取值 1.2 神经元会计算传递过来的信号总和 只有当信号总和超过某个界限的时候,神经元才会被激活 1.3 信号权重 不同的权重对应的信号的重要性越高 二、常见的逻辑电路 与门与非门或门 2.1 思考 使用感…

@Scope与@RefreshScope注解

在SpringIOC中,我们熟知的BeanScope有单例(singleton)、原型(prototype), Bean的Scope影响了Bean的管理方式,例如创建Scopesingleton的Bean时,IOC会保存实例在一个Map中,…

nest.js创建以及error相关问题

开始之前,你可以使用 Nest CLI 创建项目,也可以克隆一个 starter project(两者的结果是一样的)。 若要使用 Nest CLI 构建项目,请运行以下命令。这将创建一个新的项目目录,并使用核心的 Nest 文件和支撑模…

我把 CPU 三级缓存的秘密,藏在这 8 张图里

本文已收录到 GitHub AndroidFamily,有 Android 进阶知识体系,欢迎 Star。技术和职场问题,请关注公众号 [彭旭锐] 进 Android 面试交流群。 前言 大家好,我是小彭。 在上一篇文章里,我们聊到了计算机存储器系统的金…

盘点机PDA搭配蓝牙便携打印机,条码标签打印,超市仓库条码管理,条码标签纸

null使用盘点机PDA,搭配蓝牙便携打印机,移动打印条码标签的操作和设置。对于商品本身没有条码的商品,比如:外购回来无条码的商品,工厂自己生产出来的成品,那么这种就需要打印商品条码进行粘贴,即…

Spring Security认证之登录表单配置

本文内容来自王松老师的《深入浅出Spring Security》,自己在学习的时候为了加深理解顺手抄录的,有时候还会写一些自己的想法。 自定义登录页面 文接上篇,这一篇学习如何自定义登录表单。我们创建一个Spring Boot项目之后,还是一样…

windows docker 及 k8s 环境搭建

docker 环境搭建 下载 docker 下载 docker for desktop, , 配置 镜像源 开通 kubenates 功能 注册一个 docker hub 账号 记住账号密码, 将来拉取镜像要用到, 在 docker for desktop 中登录该账号 kubenates 环境搭建 docker 中开通 k8…

nginx服务器

一、介绍 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2…

用户管理系统(2)

2.实现添加功能:有两个和后端交互的接口 根据用户的身份显示登陆界面: 进行插入操作: 1)在我们的前端直接获取到用户名,密码,确认密码,年龄,QQ,邮箱,判断他们是否为空,检测密码和确认密码是否一…

docker 第二次学习笔记

一、dockers简介 docker官网:https://www.docker.com 1.1 docker定义 docker是一种容器化技术,用来更好的构建和发布应用。 二、docker安装 2.1 方法1 centos7.x系统的安装 官网安装步骤:https://docs.docker.com/engine/install/cento…

IDEA中,maven项目下,lombok插件 ,添加lombok.jar, Maven项目下lombok依赖配置

IDEA中,maven项目下,lombok插件 ,添加lombok.jar, Maven项目下lombok依赖配置 Maven 项目的创建 在IDEA 21版中,Maven项目无需下载其他版本,查看有无Maven,如果没有下载 安装 首先打开IDEA ,点…