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: 图片加载的引擎,负责管理内存缓存和磁盘缓存。
- ActiveResources: 活动缓存,存储当前界面使用到的图片。界面不展示后,该Bitmap又被缓存至MemoryCache中,并从ActiveResources中删除。
- MemoryCache: 内存缓存。当MemoryCache中得到Bitmap后,该Bitmap又被缓存至ActiveResources中,并从MemoryCache中删除。
- DiskCache: 磁盘缓存。
这篇文章就先介绍这里。