Glide 4.7.1添加RequestListener后无法加载GIF到ImageView的问题
问题分析与解决方案
你遇到的问题核心在于Glide的RequestListener.onResourceReady返回值的作用,以及它和Target自动绑定资源的逻辑冲突。
在Glide 4.x中,RequestListener.onResourceReady的返回值直接影响后续流程:
- 返回
false:告诉Glide“我没处理完,你继续把资源绑定到Target(也就是你的ivGif)上” - 返回
true:告诉Glide“我已经处理了资源,你不用管后续绑定了”
但你当前的代码里,虽然返回了false,但大概率是因为ivGif初始状态为隐藏(GONE/INVISIBLE),加上Glide 4.7.1的版本特定行为,导致后续的自动资源绑定没有生效,才出现GIF加载完成却不显示的情况。
修正后的代码方案(推荐)
你可以手动将加载好的GifDrawable设置到ivGif中,并返回true来接管资源处理逻辑:
Glide.with(context) .asGif() .load(gifModel.url) .listener(new RequestListener<GifDrawable>() { @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<GifDrawable> target, boolean isFirstResource) { // 加载失败时也记得隐藏占位图,避免一直显示 ivPreGif.setVisibility(View.GONE); // 返回false让Glide处理默认失败逻辑(比如显示错误占位图) return false; } @Override public boolean onResourceReady(GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) { ivPreGif.setVisibility(View.GONE); ivGif.setVisibility(View.VISIBLE); // 手动将GIF资源设置到ImageView ivGif.setImageDrawable(resource); // 确保GIF自动播放(部分场景下手动设置后需要主动触发) resource.start(); // 返回true,告诉Glide我们已经完成资源处理 return true; } }) .into(ivGif);
另一种思路:保持Glide自动绑定流程
如果你想保留Glide的自动资源绑定,可以调整视图初始状态:让ivGif初始为VISIBLE但完全透明,加载完成后再显示它并隐藏占位图,此时返回false也能正常工作:
// 初始布局设置:ivGif为VISIBLE+alpha=0,ivPreGif正常显示 Glide.with(context) .asGif() .load(gifModel.url) .listener(new RequestListener<GifDrawable>() { @Override public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<GifDrawable> target, boolean isFirstResource) { ivPreGif.setVisibility(View.GONE); return false; } @Override public boolean onResourceReady(GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) { ivPreGif.setVisibility(View.GONE); ivGif.setAlpha(1f); // 返回false让Glide继续完成资源绑定 return false; } }) .into(ivGif);
内容的提问来源于stack exchange,提问作者tr4n
相关产品推荐
相关产品推荐

