以下是从初级到高级的 Glide 在 Android 开发中的全面用法解析,结合实例代码和场景说明,帮助开发者灵活应对不同需求。
初级用法:基础图片加载
1. 加载网络图片
Glide.with(context)
.load("https://example.com/image.jpg")
.into(imageView)
- 作用:将网络图片异步加载到
ImageView,自动处理图片尺寸适配。
2. 加载本地资源
Glide.with(context)
.load(R.drawable.local_image)
.into(imageView)
- 作用:加载
res/drawable或assets中的本地图片。
3. 占位符与错误图
Glide.with(context)
.load(url)
.placeholder(R.drawable.placeholder) // 加载中的占位图
.error(R.drawable.error) // 加载失败的占位图
.fallback(R.drawable.fallback) // 当模型为 null 时的占位图
.into(imageView)
中级用法:进阶配置与优化
1. 图片变换(Transformation)
// 内置变换:圆角、裁剪等
Glide.with(context)
.load(url)
.transform(CircleCrop(), RoundedCorners(16)) // 圆形 + 圆角
.into(imageView)
// 自定义变换(如高斯模糊)
class BlurTransformation : BitmapTransformation() {
override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap {
return blurBitmap(toTransform) // 实现模糊算法
}
// 唯一标识变换的 Key
override fun updateDiskCacheKey(messageDigest: MessageDigest) {
messageDigest.update("blur_transformation".toByteArray())
}
}
// 使用自定义变换
Glide.with(context)
.load(url)
.transform(BlurTransformation())
.into(imageView)
2. 缓存策略控制
// 跳过内存缓存
Glide.with(context)
.load(url)
.skipMemoryCache(true) // 仅跳过内存缓存
.into(imageView)
// 仅从缓存加载(无缓存则失败)
Glide.with(context)
.load(url)
.onlyRetrieveFromCache(true)
.into(imageView)
// 磁盘缓存策略(默认:自动选择缓存类型)
Glide.with(context)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL) // 缓存原始数据 + 转换后的资源
.into(imageView)
3. 加载监听与回调
Glide.with(context)
.load(url)
.listener(object : RequestListener<Drawable> {
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean {
// 处理加载失败
return false // 返回 true 表示已处理,不触发 error 占位符
}
override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
// 图片加载完成
return false
}
})
.into(imageView)
高级用法:深度定制与性能优化
1. 自定义 GlideModule(替换网络层为 OkHttp)
// 步骤1:添加依赖
implementation 'com.github.bumptech.glide:okhttp3-integration:4.12.0'
// 步骤2:创建自定义 GlideModule
@GlideModule
class MyAppGlideModule : AppGlideModule() {
override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
val okHttpClient = OkHttpClient.Builder()
.addInterceptor { chain ->
// 添加统一请求头
val request = chain.request().newBuilder()
.header("User-Agent", "MyApp")
.build()
chain.proceed(request)
}
.build()
registry.replace(GlideUrl::class.java, InputStream::class.java, OkHttpUrlLoader.Factory(okHttpClient))
}
override fun applyOptions(context: Context, builder: GlideBuilder) {
// 配置内存缓存大小(默认:设备内存的 1/8)
builder.setMemoryCache(LruResourceCache(1024 * 1024 * 100)) // 100MB
}
}
2. 加载 GIF 并控制播放
// 加载 GIF(默认自动播放)
Glide.with(context)
.load("https://example.com/animation.gif")
.into(imageView)
// 手动控制 GIF 播放
val gifDrawable = Glide.with(context)
.asGif()
.load(gifUrl)
.submit() // 返回 FutureTarget<GifDrawable>
// 开始播放
gifDrawable.get().start()
// 停止播放
gifDrawable.get().stop()
3. 加载缩略图(Thumbnail)
// 同时加载原图和缩略图(快速显示低分辨率图)
Glide.with(context)
.load(url)
.thumbnail(0.1f) // 原图 10% 的缩略图
.into(imageView)
// 先加载其他图片作为缩略图
Glide.with(context)
.load(url)
.thumbnail(
Glide.with(context)
.load(thumbnailUrl)
)
.into(imageView)
4. 资源回收与复用
// 手动释放 Glide 内存(在 onTrimMemory 中调用)
Glide.get(context).clearMemory()
// 复用 BitmapPool 优化内存
Glide.with(context)
.load(url)
.apply(RequestOptions.bitmapTransform(object : BitmapTransformation() {
override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap {
// 从 BitmapPool 复用 Bitmap
val reusedBitmap = pool.get(outWidth, outHeight, Bitmap.Config.ARGB_8888)
// 处理图片并返回
return processBitmap(reusedBitmap)
}
}))
.into(imageView)
场景化解决方案
1. 列表滑动优化
// RecyclerView 的 onScrollStateChanged 中控制加载
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
when (newState) {
RecyclerView.SCROLL_STATE_DRAGGING -> Glide.with(context).pauseRequests()
RecyclerView.SCROLL_STATE_IDLE -> Glide.with(context).resumeRequests()
}
}
})
2. 大图加载优化(如长图、高清图)
// 使用 override 限制加载尺寸
Glide.with(context)
.load(url)
.override(1000, 1000) // 限制为 1000x1000 像素
.into(imageView)
// 结合 SubsamplingScaleImageView(第三方库)
Glide.with(context)
.load(url)
.into(object : CustomTarget<Bitmap>() {
override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
subsamplingScaleImageView.setImage(ImageSource.bitmap(resource))
}
})
3. 图片加载优先级
// 设置加载优先级(Priority.IMMEDIATE > HIGH > NORMAL > LOW)
Glide.with(context)
.load(highPriorityUrl)
.priority(Priority.HIGH)
.into(imageView)
总结与最佳实践
| 场景 | 推荐用法 | 优化点 |
|---|---|---|
| 常规图片加载 | 基础加载 + 占位符 | 使用 diskCacheStrategy |
| 列表滑动 | 暂停/恢复请求 + 缩略图 | 结合 RecyclerView 滚动监听 |
| 大图或高清图 | override 限制尺寸 + 第三方库支持 |
避免内存溢出(OOM) |
| 定制化需求 | 自定义 GlideModule + Transformation |
替换网络层、扩展解码器 |
| 性能敏感场景 | 复用 BitmapPool + 内存缓存调优 |
减少 GC 频率 |
调试技巧:
- 开启详细日志:adb shell setprop log.tag.Glide VERBOSE
- 检查缓存命中:通过 Debug 包查看 MemoryCache 和 DiskCache 状态。
当前文章价值6.39元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)

评论已关闭!