结合实例讲解Glide加载监听与回调的常见场景应用

2025-03-06 17:13 结合实例讲解Glide加载监听与回调的常见场景应用已关闭评论

以下是通过实例讲解 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()
        }
    })

最佳实践与注意事项

  1. 回调线程

    • RequestListener 的回调在主线程执行,避免直接进行耗时操作。
    • 需要异步处理时,应启动子线程或使用协程。
  2. 内存泄漏防护

    • 在 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
              }
          })
      
  3. 性能优化

    • 避免在 RequestListener 中频繁创建对象(如多次加载时复用监听器)。

总结:监听器场景对照表

场景 关键技术点
加载耗时统计 DataSource + 时间戳记录
自定义失败处理 onLoadFailed 返回 true
后处理(动画/分析) onResourceReady 触发后续任务
完全自定义显示逻辑 返回 true 阻止默认行为
全局监控 通过 GlideModule 注册全局监听器
进度条显示 自定义 Interceptor + 进度回调

通过合理使用加载监听与回调,可以实现从基础状态监控到复杂交互的全流程控制。在关键路径(如列表项复用、大图加载)中添加监听器,能显著提升用户体验与问题排查效率。

当前文章价值9.45元,扫一扫支付后添加微信提供帮助!(如不能解决您的问题,可以申请退款)

你可能感兴趣的文章

来源:每日教程每日一例,深入学习实用技术教程,关注公众号TeachCourse
转载请注明出处: https://teachcourse.cn/3782.html ,谢谢支持!

资源分享

分类:glide 标签:,
2026 年最前沿的 AI 工具清单 2026 年最前沿的 AI 工具清单
【C盘急救站】一键清理工具Wise Disk Cleaner详细使用教程 【C盘急救站】一键清理工具Wis
php关键字require和include详细介绍 php关键字require和include详细介
python对文件的操作 python对文件的操作

评论已关闭!