Android Glide(一):源码分析,内存缓存和磁盘缓存的分析,实现流程以及生命周期

news2024/9/29 3:54:02

目录

在这里插入图片描述


一、Android Glide是什么,如何使用?

Android Glide是一个由Google维护的快速高效的Android图像加载库,它旨在简化在Android应用程序中加载和显示图像的过程,包括内存缓存、磁盘缓存和网络加载,以确保图像加载的快速和流畅。


	Glide.with(this).load("http://xxx").into(ivProcode);

设置的很简单,提供url以及ImageView。

但如果只是会使用,那么对我们的技术是没有什么提升的,所以这篇文章,我们就来看看他的底层实现是怎么样的。


二、Glide的大体实现流程图

我们会发现,使用Glide,会有一个非常强大的缓存功能。比如下图

在这里插入图片描述
我们要展示一张图片,从http进行请求:

Glide.with(this).load("http://xxx").into(ivProcode);

那么它就会先问活动缓存有没有,内存缓存有没有,磁盘缓存有没有,如果都没有(第一次的时候就会都没有),那么就会发起http请求,将图片数据拿到,然后放到磁盘缓存,然后再放到活动缓存里面。然后展示到imagView里面。

在这里插入图片描述
如果下一次还是这个请求,那么就会从活动缓存里面直接拿,所以我们发现第二次展示图片的时候,就会非常快。
在这里插入图片描述

所以从这里我们可以知道,这个缓存,其实是一个key-value,因为它要存储你的图片地址信息(会根据你的url进行加密得出key),以及图片内容。

为什么会有活动缓存和内存缓存?他们的区别是什么,为什么要搞两个?


三、活动缓存、内存缓存以及磁盘缓存的区别

通过三级缓存机制(活动缓存、内存缓存和磁盘缓存)来优化图像加载过程,以提高加载速度和减少网络请求。以下是这三种缓存机制的区别:

3.1 活动缓存

活动缓存主要存储什么?只要存储正在显示的图片!!!

活动缓存的作用范围限定在单个Activity或Fragment的生命周期内。当页面退出或资源不再被使用时,相应的缓存会自动清除。

活动缓存的主要目的是分担内存缓存的负担,及时释放内存资源,避免整个应用退出时才释放内存。它的大小相对较小,如果活动缓存满了,会自动将部分数据写入内存缓存。

3.2 内存缓存

内存缓存的作用范围是整个应用程序。只要应用程序没有完全退出,内存缓存中的数据就会保持有效。

但是,由于内存资源有限,因此内存缓存的大小会受到限制。Glide默认使用LRU(最近最少使用)策略来管理内存缓存,确保最近使用或最频繁使用的图片数据能够保留在内存中。

所以,这也是为什么会有活动缓存的原因,如果App显示了很多图片,有些在界面显示,但是又刚好满足LRU策略被回收掉了怎么办,那么再次使用就会出现问题。所以会将正在显示的图片,放到活动缓存里面,活动缓存没有LRU策略。

3.3 磁盘缓存

上面介绍的内存缓存和活动缓存,都是运行时缓存,断电就没了。

磁盘缓存是将图片数据存储在设备的本地磁盘上的一种缓存机制。它的作用范围是整个系统。只要磁盘上的数据没有被删除,那么它就可以一直被访问。

磁盘缓存的容量相对较大,可以存储更多的图片数据。但是,由于磁盘读写速度较慢于内存,因此磁盘缓存的访问速度相对较慢。不过,对于已经加载过的图片数据来说,磁盘缓存可以显著减少网络请求和加载时间。

接下来,我们看看源码,从with方法开始看起。


四、with方法分析(生命周期)

这里会判断是否为子线程,如果是子线程,那么添加的生命周期,就是Application的
在这里插入图片描述如果不是子线程,那么添加的就是页面的生命周期。主线程才会创建一个空白的Fragment监听Activity Fragment的变化。
在这里插入图片描述但,为什么要做一个增加生命周期?因为我们要在页面切换的时候,清理掉活动缓存,释放资源。添加空白的Fragment的原因,是因为Fragment会根据Activity的销毁而自动销毁,也就是会自动调用onstop这些生命周期方法。

如果不添加空白的Fragment,那么就需要写到Activity的onStop方法里面,如果万一忘记了呢,并且这个操作给用户来,是不方便的。

总结:with流程主要涉及到根据传入的上下文获取或创建一个RequestManager对象,并将该对象的生命周期与上下文的生命周期绑定在一起。这个流程是Glide图片加载机制的重要组成部分,它确保了图片加载请求的高效管理和生命周期的正确处理。


五、load流程分析

是一个构建和配置加载请求的过程。它通过load(…)方法接收资源标识符,并通过RequestBuilder对象提供的方法配置请求参数。

glide支持多种图片的来源,包含url、本地文件、资源ID等等,从而会重写不同参数类型的load()方法。

最终,在into(…)方法被调用时,构建好的加载请求会被添加到请求队列中,等待执行。

load总结: 其实也就是一些初始化的创建工作,最后获取RequestBuilder。


六、into流程分析

into流程负责将加载的图片显示到指定的视图。比如会读取在布局中imageView的参数,进行设置,测量宽高等等,进行参数的设置,然后将图片显示。
在这里插入图片描述

Engine: 图片加载的引擎,负责管理内存缓存和磁盘缓存。

  1. ActiveResources: 活动缓存,存储当前界面使用到的图片。界面不展示后,该Bitmap又被缓存至MemoryCache中,并从ActiveResources中删除。
  2. MemoryCache: 内存缓存。当MemoryCache中得到Bitmap后,该Bitmap又被缓存至ActiveResources中,并从MemoryCache中删除。
  3. DiskCache: 磁盘缓存。

在这里插入图片描述
在这里插入图片描述
这篇文章就先介绍这里。

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

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

相关文章

算力共享系统中数据平面和控制平面

目录 算力共享系统中数据平面和控制平面 数据平面 控制平面 算力共享系统举例 控制流程和业务流程,在算力共享系统中举例说明 控制流程 业务流程 算力共享系统中数据平面和控制平面 在算力共享系统中,数据平面和控制平面是两个关键组成部分,它们各自承担着不同的角色…

网络层——IP

IP地址 结构: 由32位二进制数组成,通常用点分的形式被分为四个部分,每个部分1byte,最大值为255。 从功能的角度看,ip地址由两部分组成,网络号和主机号。网络号标识了ip所在的网段,主机号标识了…

AI大模型:揭秘AI产品经理与传统产品经理的差别与转型攻略

引言: 随着ChatGPT等革命性产品的流行,人工智能(AI)在中国的发展势头愈发强劲。众多企业纷纷投身AI领域,希望在激烈的市场竞争中占据有利位置。在这一背景下,AI产品经理成为了一个备受瞩目的职业角色。那么…

智慧环保大数据平台建设方案

1. 智慧环保现状与挑战 随着环境问题日益严重,环境事件频发,如贵州都匀矿渣污染、云南南盘江水污染等,以及癌症高发率的出现,智慧环保建设显得尤为重要。智慧环保旨在通过技术手段提升环境管理和决策的智能化水平。 2. 宏观环境…

ubuntu系统下,c++图形库Matplot++配置

linux下安装c图形库Matplot,使得c可以可视化编程;安装Matplot之前,需要先安装一个gnuplot,因为Matplot是依赖于此库 gnuplot下载链接: http://www.gnuplot.info/ 一、gnuplot下载与安装 step1.进入链接点击Release链…

一文了解ChatGPT的发展浪潮

前言 近一段时间在学Prompt,刚好学到了ChatGPT的一些发展史,因此沉淀一些相关的概念内容。 以下开始本文的讲解~👨🚀 一、AI简述 人工智能发展史上的三次浪潮: 人工智能、机器学习和深度学习的关系: 人…

大碗娱乐发布业务调整说明 取消艺人经纪业务

大碗娱乐今日发布业务调整说明:不再负责艺人业务,而贾玲导演将专注内容创作。据悉,其公司旗下艺人张小斐、许君聪、卜钰、何欢、张泰维、朱天福、曹贺军、刘宏禄的经纪合约均已到期,双方不再续约,但未来会共同寻求以其…

Excel的基本应用__3

九九乘法表 MAX函数:找出最大值 FREQUENCY函数:计算符合区间的数量 语法: FREQUENCY(data_array, bins_array) data_array:要计算频率的数据数组或单元格区域。bins_array:用于定义区间的数组或单元格区域。 如果您不按 Ctrl Shift Ent…

Soar项目中添加一条新的SQL审核规则示例

soar是一个开源的SQL规则审核工具,是一个go语言项目,可以直接编译构建成一个可执行程序,而且是一个命令行工具,我们可以利用archey来调用soar进行sql规则审核以及sql的分析,包括执行计划的查看及sql建议等。 soar中已…

django开发流程3(轮播图)

1.在models中创建一个模板 class Ads(models.Model):title models.CharField(verbose_name"标题", max_length30)image models.ImageField(verbose_name"广告图", upload_to"ads")url models.URLField(verbose_name"链接网址", de…

Stable Diffusion绘画 | Checkpoint Merger 模型融合

在我们的模型库中,经常会发现下载的模型,生成的图片颜色发灰,暗沉: 主要原因就是,我们下载的模型,作者训练时并没有加入VAE色调文件。 为了解决这个问题,我们可以使用 SD 自带额模型融合页面&am…

召回08 双塔模型——线上服务、模型更新

线上召回 离线存储: 模型训练好之后,部署到线上做召回,快速找到用户感兴趣的物品。 对训练好的两个塔,线上服务前,先用右边的物品塔提取物品的特征做离线存储,记作特征向量b,把(b…

redux的基础知识

1. 概念 是集中状态管理工具 2. 使用步骤 3. 总结 参考:黑马程序员react教程

Linux Reverse(1)-LD_PRELOAD

LD_PRELOAD 是 Linux 系统中的一个环境变量,它允许用户在程序运行时动态地加载共享库。通过设置该环境变量,用户可以指定一个或多个共享库,这些库中的函数将在其他库或程序调用相同函数时优先使用。这在调试、注入、替换函数实现或修改程序行…

大数据Hologres(二):Hologres 快速入门

文章目录 Hologres 快速入门 一、资源领取 二、入门体验 1、创建数据库 2、创建表 3、导入示例数据 4、查询表中数据 Hologres 快速入门 一、资源领取 领取链接: 阿里云免费试用 - 阿里云 (aliyun.com) 二、入门体验 1、创建数据库 进入Hologres管理控制…

递归,搜索与回溯40道算法题

目录 一递归 1汉诺塔问题 2合并两个有序链表 3反转链表 4两两交换链表的节点 5Pow(x,n) 二二叉树的深搜 1计算布尔二叉树的值 2求根节点到叶节点数字之和 3二叉树剪枝 4验证二叉搜索树 5二叉搜索树中第K小的元素 6二叉树的所有路径 三穷举vs暴搜vs深搜vs回溯vs…

AI 大模型浪潮下,大龄程序员怎样转型求变,攀登技术高峰?

前言 在信息技术迅猛发展的今天,程序员作为技术的创造者和实践者,正面临前所未有的挑战。技术的迭代速度日益加快,传统项目的生命周期不断缩短。同时,人工智能(AI)尤其是大模型技术的兴起,使得…

如何使用ssm实现基于web的学生就业管理系统的设计与实现+vue

TOC ssm726基于web的学生就业管理系统的设计与实现vue 第1章 绪论 1.1 课题背景 二十一世纪互联网的出现,改变了几千年以来人们的生活,不仅仅是生活物资的丰富,还有精神层次的丰富。在互联网诞生之前,地域位置往往是人们思想上…

算法题题解:两个链表的交点

在这篇博客中,请允许我分享一下力扣上的算法题目:“两个链表的交点”,记录一下上面的一个有效的解法。该问题的目标是找到两个单链表的交点节点,若无交点则返回NULL。 题目描述 给你两个单链表的头节点 headA 和 headB &#xf…

【蚂蚁HR-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…