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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:37:48