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

news/2024/12/21 23:47:08/

目录

在这里插入图片描述


一、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.ppmy.cn/news/1534270.html

相关文章

UE4_Niagara基础实例—6、蓝图与粒子系统的通信

效果图: 分析: 通过键盘按键来修改粒子系统粒子的大小。 步骤: 1、粒子系统使用上一个实例的粒子系统,大体参数如下: 参数都是乱调的,自己可以随意设置,只注重方法而不在意好看,汗…

【数一线性代数】021入门

Index 推荐阅读:https://blog.csdn.net/weixin_60702024/article/details/141729949分析实现总结 推荐阅读:https://blog.csdn.net/weixin_60702024/article/details/141729949 给定二叉树的根节点root,计算其叶节点的个数。 分析实现 类似…

Python 中的 os 模块

Python 中的 os 模块 在Python中,os 模块是一个内置的标准库,提供了许多与操作系统交互的功能。它允许你执行一系列操作,如文件和目录操作、环境变量管理等。要在Python脚本中使用os模块,你需要首先导入它。 一些常见的用法&…

需求6:如何写一个后端接口?

这两天一直在对之前做的工作做梳理总结,不过前两天我都是在总结一些bug的问题。尽管有些bug问题我还没写文章,但是,我今天不得不先停下对bug的总结了。因为在国庆之后,我需要自己开发一个IT资产管理的功能,这个功能需要…

【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第十五章 Linux 文件系统概念

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐…

Xshell7下载及服务器连接

一、Xshell-7.0.0164p、Xftp 7下载 1.1、文件下载 通过网盘分享的文件:xshell 链接: https://pan.baidu.com/s/1qc0CPv4Hkl19hI9tyvYZkQ 提取码: 5snq –来自百度网盘超级会员v2的分享 1.2、ip连接 下shell和xftp操作一样:找到文件—》新建—》名称随…

PTH 实验

1. 实验网络拓扑 kali: 192.168.72.128win2008: 192.168.135.129 192.168.72.139win7: 192.168.72.149win2012:(DC) 192.168.72.131 2. EXPLOIT 0x0. NTLM hash计算脚本 python3 -c import hashlib,binascii; print (binascii.hexlify(hashlib.new("md4", "…

一天认识一个硬件之键盘

今天分享的这个硬件,就比较常见了,日常的生活,学习,工作都需要用到。但是可能很少人去了解键盘,而且也不知道为什么有些键盘卖的特别贵,也不知道键盘与键盘之间的区别。我先从什么是键盘开始分享&#xff0…