Glide源码

1.主要特点
(1)支持Memeory和Disk图片缓存
(2)支持gif和webp格式
(3)根据Activity、Fragment生命周期自动管理请求
(4)使用Bitmap Pool可以使用Bitmap复用
(5)对于回收的Bitmap会主动调用recycle,减小系统回收的压力
2.总体设计
自上而下
       RequestManager:GenericRequest,ThumbnailRequestCoordinator
       Engine:EngineJob,DecodeJob
       LoadData:MemoryCache ActivityRecouse  DataFetcher(LocalFetcher,UrlFetcher)
       Data:MemeoryCache  Disk   Server


基本概念:
RequestManager:请求管理,每一个Activity都会创建一个RequestManager,根据对应Activity的生命周期管理
该Activity上所有的图片请求
Engine:加载图片的引擎,根据Request创建EngineJob和DecodeJob
EnginJob:图片加载
DecodeJob:图片处理3.Glide
用于保存整个框架中配置重要方法
public static RequestManager with(FragmentActivity activity){
RequestManagerRetriever retriever=RequestManagerRetriever.get();
return retriever.get(activity);
}
用于创建RequestManager,这里是Glide通过Activity/Fragment生命周期管理Request原理所在。
主要原理是创建一个自定义Fragment,然后通过自定义Fragment声明周期操作RequestManager,从而达到管理
Request。

3.2 RequestManagerRetriever
RequestManager supportFragmentGet(Context context,Fragment fm){
SupportRequestManagerFragment current=getSupportRequestManagerFragment(fm);
RequestManager requestManager=current.getRequestManager();
if(questManager==null){
requestManager=new RequestManager


(context,current.getLifecycle,current.getRequestManagerTreeNode);
current.setRequestManager(questManager);
}
return requestManager;
}
这里判断是否只当前RequestManagerFragment是否存在RequestManager,保证一个Activity对应一个
RequestManager,这样有利于管理一个Activity上所有的Request。创建RequestManager的时候会将
RequestManagerFragment中的回溯接口,赋值给RequestManager,达到RequestManager监听
RequestManagerFragment中的接口回调给RequestManager,达到RequestManager监听RequestManagerFragment的
生命周期。
load方法
步骤:
private EngineResource<?> loadFromCache(Key key, boolean isMemoryCacheable) {
....
EngineResource<?> cached = getEngineResourceFromCache(key);
if (cached != null) {
cached.acquire();
activeResources.put(key, new ResourceWeakReference(key, cached, getReferenceQueue()));
}
return cached;
}
 
@SuppressWarnings("unchecked")
private EngineResource<?> getEngineResourceFromCache(Key key) {
Resource<?> cached = cache.remove(key);
 
final EngineResource result;
...
return result;
}
(1)获取MemoryCache中缓存,首先创建当前Request的缓存key,通过key值从MemoryCache中获取缓存,判断缓
存是否存在,从缓存中获取的时候使用cache.remove(key),然后将值保存在activeResources中,然后将
Resource的引用计数加一。
正使用的Resource将会在activeResources中,不会出现在cache中,当MemoryCache中缓存饱和的时候或者系统
内存不足的时候,清理Bitmap可以直接调用recycle。不用考虑Bitmap正在使用导致异常,加快系统的回收。
(2)获取activeResource中缓存
activeResource通过弱引用保存resource,也是通过key获取缓存
private EngineResource<?>loadFromActiveResources(Key key,boolean isMenoryCacheable)
(3)判断当前的请求任务是否已经存在
EngineJob curret=jobs.get(key);
if(current!=null){
current.addCallback(cb);
return new LoadStatus(cb,current);
}
如果任务请求已经存在,直接将回调事件传递给已经存在EngineJob,用于请求成功后触发回调。
(4)执行请求任务
EngineJob engineJob = engineJobFactory.build(key, isMemoryCacheable);
DecodeJob<T, Z, R> decodeJob = new DecodeJob<T, Z, R>(key, width, height, fetcher, loadProvider, transformation,
transcoder, diskCacheProvider, diskCacheStrategy, priority);
EngineRunnable runnable = new EngineRunnable(engineJob, decodeJob, priority);
jobs.put(key, engineJob);
engineJob.addCallback(cb);
engineJob.start(runnable);


EngineRunnable
请求执行Runnable,主要功能请求资源、处理资源、缓存资源。
加载DiskCache和网络资源。加载DiskCache包括两个,因为Glide默认是保存处理后的资源(压缩和裁剪后),
缓存方式可以自定义配置。如果客户端规范设计,ImageView大小大部分相同可以节省图片加载时间和Disk资源
DecodeJob
public Resource<Z> decodeResultFromCache()throws Exception
public Resource<Z>decodeSourceFromCache() throws Exception
从缓存中获取处理后的资源。上面有关key的内容,Key是一个对象,可以获取key和originKey。
decodeResultFromCache就是通过key获取缓存。
处理和包装资源,缓存资源。
//保存原资源
private Resource<T> cacheAndDecodeSourceData(A data)throws IOException
//保存处理后的资源
private void writeTransformedToCache(Resource<T> transformed)

Transformation
Resource<T> transform(Resource<T>resource,int outWidth,int outHeight)
处理资源,这里面出现BitmapPool类,达到Bitmap复用

ResourceDecoder
用于将文件、IO流转换为Resource

BitmapPool
用于存放从LRUCache中remove的Bitmap,用于后面创建Bitmap时候的重复利用

Glide的优点
(1)支持对处理后的资源Disk缓存
(2)通过BitmapPool对Bitmap复用
(3)使用ActivityResource缓存正在使用的resource,对BitmapPool饱和移除的Bitmap直接调用recycle加速内
存回收。RequestManager创建流程图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值