一、Android Glide 使用指南
Glide 是 Android 开发中最常用的图片加载库之一,具有 高效缓存、内存优化、链式调用 等特性,适用于加载网络图片、本地图片、GIF 等。以下是 Glide 的基本用法和高级功能。
1. 基本用法
1.1 添加依赖
在 build.gradle 中添加:
| |
1.2 加载网络图片
| |
1.3 加载本地资源
| |
1.4 加载 GIF
| |
2. 常用配置
2.1 占位图 & 错误图
| |
2.2 调整图片大小
| |
2.3 缓存策略
| |
可选缓存策略:
DiskCacheStrategy.NONE:不缓存DiskCacheStrategy.DATA:只缓存原始图片DiskCacheStrategy.RESOURCE:只缓存转换后的图片DiskCacheStrategy.ALL:缓存所有(默认)
2.4 图片变换(圆角、圆形裁剪)
| |
3. 高级用法
3.1 监听加载状态
| |
3.2 自定义 GlideModule(全局配置)
在 AndroidManifest.xml 中注册:
| |
自定义 GlideModule:
| |
3.3 加载缩略图(先加载低分辨率图)
| |
4. 常见问题
4.1 Glide 如何清理缓存?
| |
4.2 如何避免 RecyclerView 图片闪烁?
使用 Glide 的 signature() 确保缓存唯一性:
| |
4.3 如何加载 Base64 图片?
| |
5. 总结
| 功能 | Glide 方法 |
|---|---|
| 加载网络图片 | .load(url) |
| 加载本地图片 | .load(file) 或 .load(resId) |
| 加载 GIF | .asGif() |
| 占位图 & 错误图 | .placeholder() / .error() |
| 图片变换 | .circleCrop() / .transform() |
| 缓存控制 | .diskCacheStrategy() |
| 监听加载状态 | .listener() |
Glide 是 Android 图片加载的 首选库,适用于大多数场景,能有效优化内存和性能。
二、Android Glide 框架原理详解
Glide 是一个高效、灵活的 Android 图片加载库,其核心设计围绕 快速加载、内存优化、缓存管理 展开。以下是 Glide 的核心工作原理:
1. Glide 的核心架构
Glide 的架构分为 4 层,各层职责明确:
- API 层(
Glide.with().load().into()):提供用户友好的链式调用接口。 - Engine 层:负责 加载、解码、转换、缓存 图片。
- Decode 层:处理图片解码(如 Bitmap、GIF、WebP)。
- Registry 层:管理组件(如
ModelLoader、ResourceDecoder),支持扩展。
2. 核心流程(图片加载步骤)
当调用 Glide.with(context).load(url).into(imageView) 时,Glide 的执行流程如下:
2.1 初始化请求
Glide.with(context)- 绑定生命周期(Activity/Fragment),防止内存泄漏。
- 通过
RequestManagerRetriever获取RequestManager。
.load(url)- 解析数据源(URL、File、Resource 等),生成
RequestBuilder。
- 解析数据源(URL、File、Resource 等),生成
.into(imageView)- 创建
Target(如ImageViewTarget)并启动加载任务。
- 创建
2.2 加载与缓存
检查内存缓存
- 使用
LruResourceCache(基于 LRU 算法)查找是否缓存了目标图片。 - 如果命中,直接返回
Bitmap并显示。
- 使用
检查磁盘缓存
- 如果内存缓存未命中,检查磁盘缓存(
DiskLruCache)。 - 磁盘缓存分为:
- 原始数据缓存(未解码的图片数据)。
- 转换后缓存(如圆角、裁剪后的图片)。
- 如果内存缓存未命中,检查磁盘缓存(
从源加载
- 如果缓存未命中,通过
ModelLoader(如HttpUrlFetcher)从网络或本地加载数据。
- 如果缓存未命中,通过
解码与转换
- 使用
ResourceDecoder将原始数据(如 InputStream)解码为Bitmap或GIF。 - 应用
Transformation(如圆角、裁剪)。
- 使用
缓存结果
- 将解码后的
Bitmap存入内存缓存。 - 可选是否缓存转换后的图片到磁盘。
- 将解码后的
显示图片
- 通过
ImageViewTarget将图片设置到ImageView。
- 通过
3. 关键优化技术
3.1 三级缓存机制
| 缓存层级 | 存储内容 | 特点 |
|---|---|---|
| 活动缓存 | 当前正在使用的图片 | 使用 WeakReference,避免重复加载。 |
| 内存缓存 | 解码后的 Bitmap | LruCache 管理,默认大小由设备内存决定。 |
| 磁盘缓存 | 原始数据或转换后的图片 | DiskLruCache,可配置缓存策略。 |
3.2 生命周期管理
- 通过
RequestManager绑定Activity/Fragment生命周期。 - 当页面销毁时,自动取消未完成的请求,避免内存泄漏。
3.3 图片复用(Bitmap Pool)
- 使用
BitmapPool复用已回收的Bitmap内存,减少 GC 频率。 - 通过
inBitmap重用内存,提升性能。
3.4 智能大小调整
- 根据
ImageView的尺寸自动调整图片大小,避免加载过大的Bitmap。 - 支持
override()强制指定尺寸。
4. 核心组件解析
| 组件 | 作用 |
|---|---|
RequestManager | 管理请求的生命周期,绑定到 Activity/Fragment。 |
Engine | 调度加载任务,处理缓存逻辑。 |
ModelLoader | 加载不同数据源(如 URL、File、ContentProvider)。 |
ResourceDecoder | 解码原始数据(如 InputStream → Bitmap)。 |
Transformation | 图片变换(如圆角、裁剪)。 |
Target | 接收加载结果(如 ImageViewTarget 用于显示到 ImageView)。 |
5. 与其他库对比
| 特性 | Glide | Picasso | Fresco |
|---|---|---|---|
| 缓存机制 | 内存 + 磁盘 + 活动缓存 | 内存 + 磁盘 | 三级缓存 + 内存映射 |
| GIF 支持 | ✔️ | ❌ | ✔️ |
| 生命周期管理 | ✔️(自动绑定) | ❌(需手动取消) | ✔️ |
| 内存优化 | BitmapPool + 智能尺寸 | 无特殊优化 | 原生内存管理(更省内存) |
| 扩展性 | 高(支持自定义 ModelLoader/解码器) | 一般 | 低(依赖 Facebook 实现) |
6. 总结
Glide 的核心优势:
- 高效缓存:三级缓存减少 IO 和 CPU 开销。
- 内存优化:
BitmapPool复用 + 智能尺寸调整。 - 生命周期集成:自动管理请求,避免泄漏。
- 灵活扩展:支持自定义解码、加载逻辑。
适用场景:
- 需要加载网络图片、GIF。
- 对内存和性能要求较高的场景。
通过理解 Glide 的原理,可以更好地优化图片加载流程,提升应用性能。

