Glide的ActiveResources缓存和引用队列

64 阅读1分钟

优化方向

1.缩短加载时间

1.1 图片复用

由于Android View系统的刷新机制,初始化后的每个ImageView的Bitmap对象都保存在内存中,因此可以优化以下场景的初始化时间:

1.加载大量重复的Bitmap/Drawable资源时,提前将上次加载的Bitmap对象引用添加到Hashmap中,在加载时,优先从此Hashmap中取出相同Key的Bitmap对象,避免重新加载。

以下是Glide活动缓存的实现,由activeEngineResources存储Key-Resource键值对。ImageView加载完新图片时,将图片put到activeEngineResources,活动缓存中持有该图片的弱引用,(为什么是弱引用呢?
下次ImageView加载图片时,会优先从活动缓存中寻找,如果命中Key找到图片,此图片的引用计数+1。关闭页面或ImageView替换图片时,旧图片资源被释放,引用计数-1。

ActiveResources活动缓存


final class ActiveResources {

//新请求加载图片,首先检查activeResources是否有缓存
synchronized EngineResource<?> get(Key key) 

//新请求下载数据完成后,将数据包装为EngineResource,存入activeResources
synchronized void activate(KeyEngineResource)

//RequestManager释放Target绑定的Request,并释放加载的EngineResource引用
//如果该EngineResource引用为0,将其释放到LruMemeryCache二级内存缓存中
synchronized void deactivate(Key)

//子线程常驻运行,检查上层Target被动释放后,没有release其绑定的EngineResource,
//由于activeResources持有的是EngineResource的弱引用,可通过监听引用队列,将 EngineResource
//释放到LruMemeryCache二级内存缓存中
void cleanReferenceQueue()

//activeResources全部释放
void shutdown()

//包装成弱引用的EngineResource,因为在引用队列中EngineResource为null
//所以需要持有Key,Resource,以便将其存入LruCache二级缓存中
static final class ResouceWeakReference {
 Key key,
 Resource resource,
 void reset(){
     resource = null;
     clear() ;
 }
}
}