以下是通过实例讲解 Glide 加载监听与回调的常见应用场景,涵盖加载状态监控、流程控制和数据追踪,帮助开发者实现精细化的图片加载管理。
Glide 加载监听接口:RequestListener
Glide 通过 RequestListener 接口提供两个核心回调:
- onResourceReady:加载成功回调。
- onLoadFailed:加载失败回调。
场景 1:监控加载耗时与来源
需求:统计图片加载时间,并区分数据来源(内存、磁盘、网络)。
实现:通过 DataSource 参数判断来源,记录加载时间。
Glide.with(context)
.load(url)
.listener(object : RequestListener<Drawable> {
private var startTime = 0L
override fun onLoadFailed(...): Boolean {
return false // 允许显示 error 占位符
}
override fun onResourceReady(
resource: Drawable?,
model: Any?,
target: Target<Drawable>?,
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
val loadTime = System.currentTimeMillis() - startTime
Log.d("Glide", "加载耗时: ${loadTime}ms, 数据来源: ${dataSource?.name}")
return false // 允许显示图片到 ImageView
}
})
.into(imageView)
输出示例:
加载耗时: 320ms, 数据来源: LOCAL (磁盘缓存)
加载耗时: 1500ms, 数据来源: REMOTE (网络)
场景 2:自定义加载失败处理
需求:加载失败时显示 Toast 提示,并提供重试按钮。
实现:接管失败处理逻辑,隐藏默认错误占位符。
Glide.with(context)
.load(url)
.listener(object : RequestListener<Drawable> {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<Drawable>?,
isFirstResource: Boolean
): Boolean {
showErrorToast("图片加载失败: ${e?.message}")
showRetryButton {
// 点击重试时重新加载
loadImage()
}
return true // 返回 true 表示已处理,不显示 error 占位符
}
override fun onResourceReady(...): Boolean {
return false
}
})
.into(imageView)
场景 3:加载成功后的后处理
需求:图片加载完成后执行渐显动画或颜色分析。
实现:在 onResourceReady 中触发后续操作。
// 示例1:渐显动画
Glide.with(context)
.load(url)
.listener(object : RequestListener<Drawable> {
override fun onResourceReady(...): Boolean {
imageView.animate().alpha(0f).setDuration(0).withEndAction {
imageView.animate().alpha(1f).setDuration(300)
}
return false
}
})
.into(imageView)
// 示例2:使用 Palette 提取主色调
Glide.with(context)
.asBitmap()
.load(url)
.listener(object : RequestListener<Bitmap> {
override fun onResourceReady(...): Boolean {
Palette.from(resource).generate { palette ->
val dominantColor = palette.getDominantColor(Color.GRAY)
textView.setTextColor(dominantColor)
}
return false
}
})
.into(imageView)
场景 4:阻止默认行为(完全自定义显示)
需求:将图片显示到自定义视图(非 ImageView),或处理后显示。
实现:返回 true 接管默认显示逻辑。
Glide.with(context)
.load(url)
.listener(object : RequestListener<Drawable> {
override fun onResourceReady(...): Boolean {
// 将 Drawable 设置到自定义视图
customView.setImageDrawable(resource)
return true // 返回 true 阻止默认的 into(imageView) 行为
}
override fun onLoadFailed(...): Boolean {
return true
}
})
.into(imageView) // 此处传入的 ImageView 不会显示图片
场景 5:批量请求的全局监听
需求:统计所有图片加载的成功率与平均耗时。
实现:通过 Glide.addRequestInterceptor 添加全局拦截器(需自定义组件)。
// 自定义全局监听器(需注册到 GlideModule)
class GlobalRequestListener : RequestListener<Drawable> {
override fun onResourceReady(...): Boolean {
trackSuccessEvent(dataSource)
return false
}
override fun onLoadFailed(...): Boolean {
trackFailureEvent(e)
return false
}
}
// 在 GlideModule 中注册
@GlideModule
class MyGlideModule : AppGlideModule() {
override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
glide.addRequestInterceptor { request ->
request.addListener(GlobalRequestListener())
request
}
}
}
场景 6:结合进度条显示加载进度
需求:显示网络图片的下载进度(需自定义数据获取组件)。
实现:自定义 OkHttpInterceptor 拦截进度。
// 步骤1:自定义 ProgressInterceptor
class ProgressInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val originalResponse = chain.proceed(chain.request())
val listener = getProgressListener(chain.request().url.toString())
return originalResponse.newBuilder()
.body(ProgressResponseBody(originalResponse.body!!, listener))
.build()
}
}
// 步骤2:创建带进度回调的 Glide 请求
Glide.with(context)
.load(url)
.listener(object : RequestListener<Drawable> {
override fun onResourceReady(...): Boolean {
hideProgressBar()
return false
}
override fun onLoadFailed(...): Boolean {
hideProgressBar()
return false
}
})
.into(object : CustomTarget<Drawable>() {
override fun onLoadStarted(placeholder: Drawable?) {
showProgressBar()
}
})
最佳实践与注意事项
-
回调线程:
RequestListener的回调在主线程执行,避免直接进行耗时操作。- 需要异步处理时,应启动子线程或使用协程。
-
内存泄漏防护:
- 在 Fragment/Activity 中使用匿名
RequestListener时,建议使用弱引用:val weakActivity = WeakReference(activity) Glide.with(context) .load(url) .listener(object : RequestListener<Drawable> { override fun onResourceReady(...): Boolean { weakActivity.get()?.updateUI() return false } })
- 在 Fragment/Activity 中使用匿名
-
性能优化:
- 避免在
RequestListener中频繁创建对象(如多次加载时复用监听器)。
- 避免在
总结:监听器场景对照表
| 场景 | 关键技术点 |
|---|---|
| 加载耗时统计 | DataSource + 时间戳记录 |
| 自定义失败处理 | onLoadFailed 返回 true |
| 后处理(动画/分析) | onResourceReady 触发后续任务 |
| 完全自定义显示逻辑 | 返回 true 阻止默认行为 |
| 全局监控 | 通过 GlideModule 注册全局监听器 |
| 进度条显示 | 自定义 Interceptor + 进度回调 |
通过合理使用加载监听与回调,可以实现从基础状态监控到复杂交互的全流程控制。在关键路径(如列表项复用、大图加载)中添加监听器,能显著提升用户体验与问题排查效率。
当前文章价值9.45元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)

你可能感兴趣的文章
分类:glide
标签:Glide监听, RequestListener
评论已关闭!