- 数据来源 (Data) - 构建这个图片的资源是否之前曾被写入过文件缓存?
前两步检查图片是否在内存中,如果是则直接返回图片。后两步则检查图片是否在磁盘上,以便快速但异步地返回图片。如果四个步骤都未能找到图片,则Glide会返回到原始资源以取回数据(原始文件,Uri, Url等)。
缓存策略
内存缓存策略
内存中会缓存上述的活动资源 和 内存缓存资源; 活动资源采用采取了HashMap进行弱引用进行存储; 内存缓存资源采用LRU缓存进行存储;
硬盘缓存策略类型(见DiskCacheStrategy):
- DiskCacheStrategy.DATA:磁盘写入数据为未被加载过程修改过原始数据;
- DiskCacheStrategy.RESOURCE: 将解码,变换后的资源写入磁盘;
- DiskCacheStrategy.ALL:远程的资源(URL资源)会写入原始资源和变换后的资源;本地文件资源只会写入解码变换后的资源;
- DiskCacheStrategy.NONE: 不写入任何数据到硬盘;
- DiskCacheStrategy.AUTOMATIC:它会尝试对本地和远程图片使用最佳的策略。当你加载远程数据(比如,从URL下载)时,
AUTOMATIC
策略仅会存储未被你的加载过程修改过(比如,变换)的原始数据,因为下载远程数据相比调整磁盘上已经存在的数据要昂贵得多。对于本地数据,AUTOMATIC
策略则会仅存储变换过的缩略图,因为即使你需要再次生成另一个尺寸或类型的图片,取回原始数据也很容易。
缓存键值
不同于以往的缓存键值仅以URL作为唯一标识,Glide 针对不同缓存场景构建了不同的key,活动资源和内存缓存使用的键还和磁盘资源缓存略有不同,以适应内存 ,选项,比如影响 Bitmap 配置的选项或其他解码时才会用到的参数。 以内存键值为例,加入请求的资源的图片大小发生了变化,则无法命中缓存中的key,需要去磁盘中或者网络中重新获取后进行变化。 我们看下相关Key的构造方法;
EngineKey(
Object model,
Key signature,
int width,
int height,
Map<Class<?>, Transformation<?>> transformations,
Class<?> resourceClass, Class<?> transcodeClass,
Options options)
ResourceCacheKey(
ArrayPool arrayPool,
Key sourceKey,
Key signature,
int width,
int height,
Transformation<?> appliedTransformation, Class<?> decodedResourceClass,
Options options)
DataCacheKey(Key sourceKey, Key signature)
在 Glide v4 里,所有缓存键都包含至少两个元素:
- 请求加载的 model(File, Url, Url)。如果你使用自定义的 model, 它需要正确地实现
hashCode()
和equals()
- 一个可选的
签名
(Signature)
另外,步骤1-3(活动资源,内存缓存,资源磁盘缓存)的缓存键还包含一些其他数据,包括:
- 宽度和高度
- 可选的
变换(Transformation)
- 额外添加的任何
选项(Options)
- 请求的数据类型 (Bitmap, GIF, 或其他)
修改默认缓存配置
当然Glide也提供了修改默认的缓存配置项的方式;
//更改内存缓存配置大小(当然,可以定制自己的缓存)
@GlideModule
public class YourAppGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, Glid