一、前言
? Glide 是一个优秀的图片加载框架,其图片缓存思路值得记录一下,这里简单对其进行记录,不涉及源码部分
二、缓存思路
? 首先在Glide 中缓存分为四部分:活动缓存、内存缓存、数据格式磁盘缓存(就是把所有裁剪过,压缩过、转换过的图片也保存起来),原图磁盘缓存。后面两个是自己起的名字,叫什么都行。解释如下:
- 活动缓存:主要就是使用一个
HashMap 将所有正在使用的图片进行缓存 - 内存缓存:将刚刚回收的图片采取LRU算法进行缓存
- 数据格式磁盘缓存:将所有裁剪过的、压缩过的、转换过的图片存到图片,这样就避免了再次转换
- 原图磁盘缓存:将从其它位置加载的图片保存在磁盘
? 上面是上面是四层缓存,其中活动缓存和内存缓存都是存储在内存中,程序结束后,图片就销毁了。数据格式磁盘缓存和原图磁盘缓存是保存在磁盘中的,不会随着应用关闭而销毁。其运行过程是,先从活动缓存中进行加载图片,如果没有就从内存缓存中进行加载,如果加载到就将该图片从内存缓存中移除,然后添加进活动缓存中,如果没有就从数据格式磁盘缓存中加载,如果有的话就添加进行活动缓存并进行显示,如果没有就从原图磁盘缓存进行加载,如果有的话就添加进活动缓存,如果没有就从网络进行下载或者从其它位置加载。如果下载成功就进行显示,并保存进磁盘缓存和活动缓存。
? 上面是加载流程,那么回收流程是怎么运行的?首先当活动缓存里面的图片不再使用的时候会将图片移动到内存缓存,当内存缓存数据超过限制时候就进行移除。这里注意到是一个Bitmap可能被多个地方使用,所以要对其引用进行计算,没有引用时候才移动到内存缓存。
? 为什么要划分出活动缓存,因为LRU算法会将有移除图片的可能,假设加载的图片过多,会有将正在使用的图片移除的风险。所以单独使用一个Map 进行保存正在使用的图片。 另外这里面的对每一个图片进行了KEY值计算,单独使用一个类进行保存,类里面保存了图片的各种信息。比如同一张图片的圆图、方图、模糊图等,每一种风格就是一个KEY。 ?
|