Glide的配置
在实例化Glide的时候, 对很多重要的部分做了初始化.
1 |
|
一直向下追溯, 可以找到Glide类的这个方法
1 | Glide createGlide() { |
内存缓存
Engine-load
1 | private final Map<Key, WeakReference<EngineResource<?>>> activeResources; |
可以出来一个策略就是先从内存cache中获取, 然后从activeResource中获取.
ActivityResource是一个Map, 用弱引用存储正在使用的图片资源. 关于这个集合:
- 为什么需要这样一个集合, 而不是把所有的图片资源都加入到cache中:
使用activeResources来缓存正在使用中的图片,可以保护这些图片不会被LruCache算法回收掉。 - 存储的正在使用的图片资源的弱引用: 官方的解释是对于ActiveResources中的资源的释放并没有严格约束, 为了防止内存泄漏, 使用弱引用
来看看对lrucache和ActiveResources的操作
内存cache的获取
1 | // 从cache中获取 |
内存cache的释放
先来看看resource中如何表示图片需要被释放1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17class EngineResource<Z> implements Resource<Z> {
private int acquired;
...
void acquire() {
... // 省略异常处理
++acquired;
}
void release() {
... // 省略异常处理
if (--acquired == 0) {
// 当acquired为0的使用, 表示当前图片没有被引用
listener.onResourceReleased(key, this);
}
}
}
resource中listener的回调是在EngineJob类中实现的
1 | // 图片的引用为0, 图片没有在使用了, 所以从ActiveResource中移除, 添加进lrucache |
磁盘缓存
首先要明确一点, 就是磁盘缓存不止一种. 在配置Glide的磁盘缓存的时候, 可以配置单独缓存原始图片, 还是单独缓存转化后的图片. 所以Glide的内部, 肯定对原始图片的缓存 和 转化后图片的缓存都做了处理.
入口
内存cache的工作在Engine的load方法中已经做完了. 磁盘cache在Runnable的decode()方法中
1 | private Resource<?> decode() throws Exception { |
磁盘cache读取
1 | public Resource<Z> decodeResultFromCache() throws Exception { |
磁盘缓存读取这里挺好懂的
磁盘cache写入
缓存原始图片
直接贴调用过程吧
EngineRunnable.decodeFromSource()
-> EngineRunnable.decodeFromSource()
-> DecodeJob.decodeFromSource()
-> DecodeJob.decodeSource()
-> DecodeJob.decodeFromSourceData()
-> DecodeJob.cacheAndDecodeSourceData
1 | private Resource<T> decodeSource() throws Exception { |
缓存处理过后的图片
EngineRunnable.decodeFromSource()
-> EngineRunnable.decodeFromSource()
-> DecodeJob.decodeFromSource()
-> DecodeJob.transformEncodeAndTranscode
-> DecodeJob.writeTransformedToCache
1 | private Resource<Z> transformEncodeAndTranscode(Resource<T> decoded) { |