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

Android使用Glide的error()时多次加载失败出现同资源闪烁问题

闪烁根本原因

Glide 每次调用load()发起新图片请求时,默认会先清空目标 ImageView 上当前显示的 Drawable,等新请求返回结果后再设置对应资源。连续多次请求失败的场景下,执行流程为:清空当前 error 图(出现短暂空白)→ 请求失败 → 重新设置 error 资源,这个视觉差就是你观察到的闪烁。


解决方案

方案1(最简便,优先使用):将错误资源同时设置为占位图

你实测单独使用placeholder()时无闪烁,直接将同一份错误资源同时配置给placeholder()和error()即可:

GlideApp.with(fragment)
        .load(imageUrl)
        .placeholder(resourceId)
        .error(resourceId)
        .into(view);

原理是:新请求发起时 Glide 不会清空 View,而是直接设置和 error 完全相同的占位图,请求失败后设置 error 资源也和当前显示内容一致,全程无视觉变化,自然不会出现闪烁。如果后续请求成功,目标图会正常覆盖占位/错误资源,不影响正常加载逻辑。

方案2:禁用默认过渡动画

如果你的业务需要单独设置其他占位图,无法使用方案1,可以关闭 Glide 的默认过渡动画,避免切换 Drawable 时的淡入淡出效果导致的闪烁:

GlideApp.with(fragment)
        .load(imageUrl)
        .error(resourceId)
        .transition(DrawableTransitionOptions.withNoTransition())
        .dontAnimate()
        .into(view);

方案3:自定义请求监听拦截重复设置

如果上述方案都不符合需求,可以通过自定义RequestListener,在请求失败时判断当前 View 已经显示的是不是目标 error 资源,如果是就拦截 Glide 的重复设置操作:

GlideApp.with(fragment)
        .load(imageUrl)
        .error(resourceId)
        .listener(new RequestListener<Drawable>() {
            @Override
            public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
                Drawable current = view.getDrawable();
                Drawable errorDrawable = getResources().getDrawable(resourceId);
                // 当前已经显示错误资源,直接拦截不重复设置
                if (current != null && current.getConstantState().equals(errorDrawable.getConstantState())) {
                    return true;
                }
                return false;
            }

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

如果使用ColorDrawable作为错误资源,可以将判断逻辑修改为对比颜色值:

if (current instanceof ColorDrawable && ((ColorDrawable) current).getColor() == Color.RED) {
    return true;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:24:05