一、Android Glide 使用指南Glide 是 Android 开发中最常用的图片加载库之一,具有 高效缓存、内存优化、链式调用 等特性,适用于加载网络图片、本地图片、GIF 等。以下是 Glide 的基本用法和高级功能。
1. 基本用法1.1 添加依赖在 build.gradle 中添加:
1
2
implementation 'com.github.bumptech.glide:glide:4.16.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.16.0' // 可选,用于生成 GlideApp
1.2 加载网络图片1
2
3
Glide.with(context) // Context, Activity, Fragment 或 View
.load("https://example.com/image.jpg") // 图片 URL
.into(imageView); // 目标 ImageView
1.3 加载本地资源1
2
3
4
5
6
7
8
9
// 加载 drawable 资源
Glide.with(context)
.load(R.drawable.my_image)
.into(imageView);
// 加载本地文件
Glide.with(context)
.load(new File("/sdcard/image.jpg"))
.into(imageView);
1.4 加载 GIF1
2
3
4
Glide.with(context)
.asGif() // 指定加载 GIF
.load("https://example.com/anim.gif")
.into(imageView);
2. 常用配置2.1 占位图 & 错误图1
2
3
4
5
Glide.with(context)
.load(url)
.placeholder(R.drawable.placeholder) // 加载中显示的图片
.error(R.drawable.error_image) // 加载失败显示的图片
.into(imageView);
2.2 调整图片大小1
2
3
4
Glide.with(context)
.load(url)
.override(300, 200) // 强制调整为 300x200 像素
.into(imageView);
2.3 缓存策略1
2
3
4
Glide.with(context)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL) // 缓存原始图片 + 转换后的图片
.into(imageView);
可选缓存策略:
DiskCacheStrategy.NONE:不缓存DiskCacheStrategy.DATA:只缓存原始图片DiskCacheStrategy.RESOURCE:只缓存转换后的图片DiskCacheStrategy.ALL:缓存所有(默认)2.4 图片变换(圆角、圆形裁剪) 1
2
3
4
5
6
7
8
9
10
11
// 圆形裁剪
Glide.with(context)
.load(url)
.circleCrop()
.into(imageView);
// 圆角图片
Glide.with(context)
.load(url)
.transform(new RoundedCorners(16)) // 16px 圆角
.into(imageView);
3. 高级用法3.1 监听加载状态 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Glide.with(context)
.load(url)
.listener(new RequestListener
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model,
Target
Log.e("Glide", "加载失败", e);
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model,
Target
boolean isFirstResource) {
Log.d("Glide", "加载成功");
return false;
}
})
.into(imageView);
3.2 自定义 GlideModule(全局配置)在 AndroidManifest.xml 中注册:
1
2
3
android:name="com.example.MyGlideModule" android:value="GlideModule" /> 自定义 GlideModule: 1 2 3 4 5 6 7 public class MyGlideModule extends AppGlideModule { @Override public void applyOptions(Context context, GlideBuilder builder) { // 设置全局缓存大小 builder.setMemoryCache(new LruResourceCache(20 * 1024 * 1024)); // 20MB } } 3.3 加载缩略图(先加载低分辨率图)1 2 3 4 Glide.with(context) .load(url) .thumbnail(0.1f) // 先加载 10% 大小的缩略图 .into(imageView); 4. 常见问题4.1 Glide 如何清理缓存?1 2 3 4 5 // 清理内存缓存(UI 线程) Glide.get(context).clearMemory(); // 清理磁盘缓存(需在子线程执行) new Thread(() -> Glide.get(context).clearDiskCache()).start(); 4.2 如何避免 RecyclerView 图片闪烁?使用 Glide 的 signature() 确保缓存唯一性: 1 2 3 4 Glide.with(context) .load(url) .signature(new ObjectKey(version)) // 版本变化时刷新缓存 .into(imageView); 4.3 如何加载 Base64 图片?1 2 3 4 String base64 = "data:image/png;base64,..."; Glide.with(context) .load(base64) .into(imageView); 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。.into(imageView) 创建 Target(如 ImageViewTarget)并启动加载任务。2.2 加载与缓存 检查内存缓存 使用 LruResourceCache(基于 LRU 算法)查找是否缓存了目标图片。如果命中,直接返回 Bitmap 并显示。检查磁盘缓存 如果内存缓存未命中,检查磁盘缓存(DiskLruCache)。磁盘缓存分为:原始数据缓存(未解码的图片数据)。转换后缓存(如圆角、裁剪后的图片)。从源加载 如果缓存未命中,通过 ModelLoader(如 HttpUrlFetcher)从网络或本地加载数据。解码与转换 使用 ResourceDecoder 将原始数据(如 InputStream)解码为 Bitmap 或 GIF。应用 Transformation(如圆角、裁剪)。缓存结果 将解码后的 Bitmap 存入内存缓存。可选是否缓存转换后的图片到磁盘。显示图片 通过 ImageViewTarget 将图片设置到 ImageView。3. 关键优化技术3.1 三级缓存机制缓存层级存储内容特点活动缓存当前正在使用的图片使用 WeakReference,避免重复加载。内存缓存解码后的 BitmapLruCache 管理,默认大小由设备内存决定。磁盘缓存原始数据或转换后的图片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. 与其他库对比特性GlidePicassoFresco缓存机制内存 + 磁盘 + 活动缓存内存 + 磁盘三级缓存 + 内存映射GIF 支持✔️❌✔️生命周期管理✔️(自动绑定)❌(需手动取消)✔️内存优化BitmapPool + 智能尺寸无特殊优化原生内存管理(更省内存)扩展性高(支持自定义 ModelLoader/解码器)一般低(依赖 Facebook 实现)6. 总结Glide 的核心优势: 高效缓存:三级缓存减少 IO 和 CPU 开销。内存优化:BitmapPool 复用 + 智能尺寸调整。生命周期集成:自动管理请求,避免泄漏。灵活扩展:支持自定义解码、加载逻辑。适用场景: 需要加载网络图片、GIF。对内存和性能要求较高的场景。通过理解 Glide 的原理,可以更好地优化图片加载流程,提升应用性能。