glide介绍
能力
从网络 URL、本地文件、资源 ID、Vector Drawable 等多种来源加载图
通过在宿主 Activity/Fragment 中注入空白 Fragment(SupportRequestManagerFragment
),自动监听生命周期事件(如 onStop
/onDestroy
),实现请求的暂停、恢复和取消,防止内存泄漏。
内置常用变换如 circleCrop()
(圆形裁剪)、roundedCorners(radius)
(圆角),也支持自定义变换(如高斯模糊
提供 placeholder()
设置加载中的占位图,error()
处理加载失败的替代图,增强用户体验
封装
基于 OkHttp 实现网络图片加载,用户无需手动处理网络连接。
内置线程池(DecodeJob
)和异步任务(EngineJob
),自动分配解码和加载线程,避免主线程阻塞。
复用已创建的 Bitmap 对象,减少内存分配和 GC 压力
支持 RGB_565 格式硬解码,内存占用减少 50
缓存策略
活动缓存 active cache(运行时缓存,app杀掉就没有了)
存储正在使用的图片,不使用lru算法,解决如果只用lru内存缓存,短时间缓存大量图片导致正在使用的图片被移除的风险,从而引起程序崩溃
弱引用是由这样一个HashMap维护,key是缓存的key,这个key由图片url、width、height等10来个参数组成;value是图片资源对象的弱引用形式
内存缓存 memory cache (运行时缓存,app杀掉就没有了)
release()
后计数归 0,图片会从活动缓存转移到内存缓存
触发迁移的关键事件,调用 onResourceReleased()
:
如Item划出屏幕
磁盘缓存 disk
磁盘缓存将图片存储在设备的磁盘上,当内存缓存中没有所需图片时,Glide 会先从磁盘缓存中查找。磁盘缓存可以分为全尺寸缓存和转换后缓存。全尺寸缓存存储的是原始图片,而转换后缓存存储的是经过裁剪、缩放等处
应用场景
- DiskCacheStrategy.ALL:适用于大多数场景,既能缓存原始图片,又能缓存转换后的图片,保证了图片加载的效率和灵活性。
- DiskCacheStrategy.DATA:当只需要缓存原始图片,不需要缓存转换后的图片时使用,例如需要对图片进行多次不同的转换操作。
- DiskCacheStrategy.RESOURCE:如果只关心转换后的图片,不关心原始图片,可以使用该策略,减少磁盘空间的占用。
- DiskCacheStrategy.NONE:当图片数据敏感,不希望被缓存,或者需要每次都从网络加载最新图片时使用。
- DiskCacheStrategy.AUTOMATIC:根据图片的来源和处理方式自动选择合适的缓存策略,是一种较为智能的缓存策略。
判断图片是否在使用
EngineResource
是 Glide 对图片资源(如解码后的 Bitmap
)的包装类,内部维护一个 int 类型的引用计数器(refCount) acquire()
:引用计数 +1;release()
:引用计数 -1
缓存流程与优化
- 缓存键生成
缓存键由 URL、尺寸、变换参数、解码格式等 10 余个参数生成(EngineKey
),确保不同版本的图片(如不同尺寸或变换)被正确区分。例如,同一 URL 的 100x100 和 200x200 图片会生成不同键,避免缓存冲突。 - 缓存命中顺序
加载时依次检查:活动资源 → 内存缓存 → 磁盘资源缓存 → 磁盘数据缓存 → 网络。例如,若内存缓存中存在缩放后的图片,直接复用,无需重复解码。 - 高级优化
- 签名机制:对内容变化但 URL 不变的图片(如用户头像),通过
signature()
强制刷新缓存。 - 预加载与降级:滑动时优先加载缩略图,暂停不可见区域的高分辨率请求,节省流量和 CPU 资源。
- 签名机制:对内容变化但 URL 不变的图片(如用户头像),通过
典型应用场景
- 列表滑动优化:使用
diskCacheStrategy(DiskCacheStrategy.RESOURCE)
缓存转换后的缩略图,减少滑动时的解码耗时。 - 大图片处理:通过
override(300, 200)
强制压缩尺寸,结合BitmapPool
复用内存,避免 OOM。 - 动态内容更新:对实时变化的图片(如验证码),调用
skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE)
跳过所有缓存。