Glide中采用计数的方式统计资源的引用,在每个EngineResource内部都设置一个引用计数acquired,在加载资源时引用++,释放资源时引用—:
class EngineResource<Z> implements Resource<Z> {
private int acquired; //统计引用数
synchronized void acquire() {
++acquired; //引用数 ++
}
void release() {
synchronized (this) {
if (--acquired == 0) { //每次释放时,引用数 --
listener.onResourceReleased(key, this); //上面Cache添加
}
}
}
}
- 引用数++:从活跃引用资源中、内存缓存中、资源加载中使用获得的资源时,资源的引用数 +1
- 引用数—:资源释放时引用数–
- 当引用数为0时,则将资源转移到Cache缓存中
- loadFromActiveResources(key, isMemoryCacheable)
private EngineResource<?> loadFromActiveResources(Key key, boolean isMemoryCacheable) {
if (!isMemoryCacheable) { //(1)如果跳过内存缓存直接返回null
return null;
}
EngineResource<?> active = activeResources.get(key); //(2)从activeResources中获取缓存资源
if (active != null) {
active.acquire(); //(3)资源的引用 +1 (Glide采用技术引用)
}
return active;
}
loadFromActiveResources()从活跃的引用中加载缓存资源,Glide的内部采用计数的方式统计资源的引用,当资源被引用时计数+1,资源释放是计数-1;
- loadFromCache(key, isMemoryCacheable)
private EngineResource<?> loadFromCache(Key key, boolean isMemoryCacheable) {
if (!isMemoryCacheable) {//(1)是否跳过缓存
return null;
}
EngineResource<?> cached = getEngineResourceFromCache(key);
if (cached != null) {
cached.acquire(); //(3)对资源的引用 +1
activeResources.activate(key, cached); //(4)将引用的资源添加到activeResources中
}
return cached;
}
private EngineResource<?> getEngineResourceFromCache(Key key) {
Resource<?> cached = cache.remove(key); // (2)从内存缓存中获取数据,并从cache中移除
return result;
}
loadFromCache从内存缓存资源中加载数据,具体执行流程:
- 首先判断Glide加载是否跳过缓存,如果跳过则直接返回null
- 从cache缓存中获取资源,对资源的应用数+1,并将资源放如activeResources缓存中
private final Map<T, Y> cache = new LinkedHashMap<>(100, 0.75f, true); //内存缓存Map
@Nullable
public synchronized Y remove(@NonNull T key) {
final Y value = cache.remove(key); //从Map中获取数据
if (value != null) {
currentSize -= getSize(value); //缓存数减1
}
return value;
}
上面流程中的cache实际是LruResourceCache的实例,在初始化Glide过程中传入,LruResourceCache继承了LruCache也实现了MemoryCache(适配器模式),在LruCache中使用可LinknHashMap缓存数据,在获取时从cache中根据key查找资源
内存缓存写入
ActiveResources的写入
由上面知道ActiveResources中保存当前正在引用的资源,ActiveResources中的资源的写入主要从Cache中获取资源后添加的
EngineResource<?> cached = getEngineResourceFromCache(key);
if (cached != null) {
cached.acquire();
activeResources.activate(key, cached);
}
public synchronized void onEngineJobComplete( EngineJob<?> engineJob, Key key, EngineResource<?> resource) {
if (resource != null && resource.isMemoryCacheable()) {
activeResources.activate(key, resource);
}
jobs.removeIfCurrent(key, engineJob);
}
- Cache的缓存写入
在内存中缓存使用过但此时未使用的资源缓存到Cache中,这句话简单的理解就是当活跃资源没有引用时即资源引用数为0时,添加到Cache缓存中
@Override
public synchronized void onResourceReleased(Key cacheKey, EngineResource<?> resource) {
activeResources.deactivate(cacheKey); //从活跃资源中移除
if (resource.isMemoryCacheable()) {
cache.put(cacheKey, resource); //添加到Cache缓存中
} else {
resourceRecycler.recycle(resource);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)