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

目录

在这里插入图片描述


一、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: 磁盘缓存。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前期后期

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值