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
相关产品推荐
相关产品推荐

