网上讲解 Glide 的文章一搜一大把,但几乎都是以文字的形式来讲解;我自己也写过不少 Glide 的笔记,也是文字为主;但是时间长了经常忘了其中的细节,加上 Glide 的源码不太易懂,所以决定用时序图来分析和记录研究 Glide 的过程

时序图

下面两张图是一次图片加载的大体流程,有读过源码的同学基本上通过这两种图就能回忆起其中的细节;没读过源码的同学也可以先了解下 Glide 里各个类的作用

1.jpg

glide_1.jpg

RequestManager - 请求管理器

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

glide_disk_cache.jpg

glide_memory_cache.jpg

内存缓存

内存缓存有 ActiveResourcesLruResourceCacheMemoryCache),如下图,它们关系是:

它们的不同之处:

glide_task.jpg

磁盘缓存

磁盘缓存有两层:data cache 和 resource cache,它们的关系在于:

它们的区别在于:

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;
}

使用池化技术(ArrayPoolBitmapPool)降低内存抖动

Glide 在很多地方都需要临时用到一小块的内存,使用 byte array pool 可以平缓内存使用,避免频繁的内存申请

BitmapPool 则在 Transformation.transform 做 Bitmap 转换时用得比较多

线程调度