网上讲解 Glide 的文章一搜一大把,但几乎都是以文字的形式来讲解;我自己也写过不少 Glide 的笔记,也是文字为主;但是时间长了经常忘了其中的细节,加上 Glide 的源码不太易懂,所以决定用时序图来分析和记录研究 Glide 的过程
下面两张图是一次图片加载的大体流程,有读过源码的同学基本上通过这两种图就能回忆起其中的细节;没读过源码的同学也可以先了解下 Glide 里各个类的作用


RequestManager - 请求管理器往 Activity/Fragment 添加一个 RequestManagerFragment(没有 View) 用以监听宿主的生命周期,从而实现请求的管理和绑定


内存缓存
内存缓存有 ActiveResources 和 LruResourceCache(MemoryCache),如下图,它们关系是:
onStop/onDestory/onTrimMemory 时 resource 被释放,从 ActiveResources 移除并放入 MemoryCache它们的不同之处:

磁盘缓存
磁盘缓存有两层:data cache 和 resource cache,它们的关系在于:
它们的区别在于:
Bitmap)的数据DiskCacheStrategy
NONE - 没有磁盘缓存
DATA - 只缓存 data cache
RESOURCE - 只缓存 resource cache
ALL - 都缓存
AUTOMATIC - 自动
// 看下 AUTOMATIC 的情况
// data cache,只缓存网络资源,不缓存 asset file,local disk file 等本地资源
public boolean isDataCacheable(DataSource dataSource) {
return dataSource == DataSource.REMOTE;
}
// resource cache 只缓存 asset file,local disk file 等本地资源
public boolean isResourceCacheable(
boolean isFromAlternateCacheKey, DataSource dataSource, EncodeStrategy encodeStrategy) {
return ((isFromAlternateCacheKey && dataSource == DataSource.DATA_DISK_CACHE)
|| dataSource == DataSource.LOCAL)
&& encodeStrategy == EncodeStrategy.TRANSFORMED;
}
使用池化技术(ArrayPool 和 BitmapPool)降低内存抖动
Glide 在很多地方都需要临时用到一小块的内存,使用 byte array pool 可以平缓内存使用,避免频繁的内存申请
BitmapPool 则在 Transformation.transform 做 Bitmap 转换时用得比较多
线程调度