优化方向
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。
final class ActiveResources {
//新请求加载图片,首先检查activeResources是否有缓存
synchronized EngineResource<?> get(Key key)
//新请求下载数据完成后,将数据包装为EngineResource,存入activeResources
synchronized void activate(Key,EngineResource)
//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() ;
}
}
}