You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Glide v4如何加载图片到ImageView且仅重写onLoadFailed()方法?

Glide v4 迁移:仅处理加载失败无需重写setResource()的解决方案

嗨,我完全懂你迁移到Glide v4时的这个烦恼——就想处理个加载失败的逻辑,却被迫要重写setResource()方法,确实有点冗余没必要。这里有个最贴合你需求的方案:

使用RequestListener监听加载状态

Glide v4提供的RequestListener接口专门用来监听图片请求的成功/失败状态,你只需要实现你关心的onLoadFailed方法,完全不用管Target的setResource()逻辑:

Glide.with(holder.icon.getContext())
     .load(imageUrl)
     .diskCacheStrategy(DiskCacheStrategy.ALL)
     .centerCrop()
     .addListener(new RequestListener<Drawable>() {
         @Override
         public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
             // 执行你的失败处理逻辑
             Glide.clear(holder.icon);
             holder.icon.setVisibility(View.GONE);
             // 返回false表示让Glide继续处理默认的错误行为(比如设置errorDrawable),不需要的话返回true即可
             return false;
         }

         @Override
         public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
             // 成功状态不需要额外处理,返回false让Glide正常显示图片
             return false;
         }
     })
     .into(holder.icon);

进阶:封装通用监听器(复用性更强)

如果多个地方都需要这个“加载失败就隐藏ImageView”的逻辑,可以把监听器封装成一个独立类,避免重复写匿名内部类:

public class HideImageViewOnFailListener implements RequestListener<Drawable> {
    private final ImageView targetView;

    public HideImageViewOnFailListener(ImageView targetView) {
        this.targetView = targetView;
    }

    @Override
    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
        Glide.clear(targetView);
        targetView.setVisibility(View.GONE);
        return false;
    }

    @Override
    public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
        return false;
    }
}

使用的时候就非常简洁:

Glide.with(holder.icon.getContext())
     .load(imageUrl)
     .diskCacheStrategy(DiskCacheStrategy.ALL)
     .centerCrop()
     .addListener(new HideImageViewOnFailListener(holder.icon))
     .into(holder.icon);

这个方案完美避开了必须重写setResource()的问题,完全聚焦在你需要的失败处理逻辑上,代码也更干净易维护。

内容的提问来源于stack exchange,提问作者ardevd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:22:44