Glide加载图片失败时如何保留ImageView原有默认图片不做操作
问题根源
Glide 调用into(ImageView)发起加载请求时,会在请求启动阶段第一时间清空ImageView上已有的Drawable,这个动作属于加载流程的前置默认逻辑,和onLoadFailed回调的返回值无关。即使你在onLoadFailed返回true表示自行处理加载失败逻辑,也无法阻止这个前置清空操作,这就是原有默认图消失的核心原因。
实现方案
不要直接把ImageView作为加载Target传入,改用自定义Target接管所有图片设置逻辑:仅在图片加载成功时手动给ImageView设置加载到的资源,其余加载阶段不对ImageView做任何修改,从根源上避免Glide改动ImageView上已有的默认图。
适用于Glide 4.x的实现代码:
Glide.with(myImageView.context) .load("目标图片地址") // 传入ImageView实际宽高,避免加载全尺寸图片浪费内存 .into(object : CustomTarget<Drawable>(myImageView.width, myImageView.height) { override fun onResourceReady(resource: Drawable, transition: Transition<in Drawable>?) { // 只有加载成功才覆盖原有默认图 myImageView.setImageDrawable(resource) } override fun onLoadCleared(placeholder: Drawable?) { // 空实现,不改动ImageView现有内容 } override fun onLoadFailed(errorDrawable: Drawable?) { // 加载失败不做任何操作,保留默认图 super.onLoadFailed(errorDrawable) } })
补充说明
- 如果使用Glide 3.x版本,把代码中的
CustomTarget替换为SimpleTarget即可,核心逻辑完全一致。 - 禁止在
onLoadCleared、onLoadFailed回调中执行任何修改ImageView图片资源的操作,避免覆盖原有默认图。 - 不推荐使用「提前缓存ImageView的默认图,在加载失败时重新设置回去」的方案,该方案依赖Glide内部执行时序,配置placeholder、请求复用等场景下极易出现图片闪烁、覆盖错乱问题,稳定性远低于自定义Target方案。
内容的提问来源于stack exchange,提问作者GHH
相关产品推荐
相关产品推荐

