关于Glide加载gif图(包括Recycleview中使用)

项目中由于用到了视屏的展示,在视屏列表页面产品提出做一个类似其他视屏app的功能

也就是播放视频gif的功能

一开始信心满满的一口答应 因为知道Glide是一把利器

分分钟搞定嘛!

岂知,写完发现,视频竟然一卡一顿的!!甚至直接显示了第一帧!!

下面是网上大家常见的解决方法思路,但是在我的项目中仅仅使用所谓的asGif以及添加缓存机制

并不能起到任何作用

解决Glide加载Gif非常缓慢的问题
Glide.with(MainActivity.this).load(url).asGif().into(imageView);
解决办法:
Glide.with(MainActivity.this).load(url).asGif().diskCacheStrategy(DiskCacheStrategy.SOURCE).into(imageView);

最终误打误撞,加上加载监听,即可完美解决:

代码如下:

//调用方法
        Glide.with(MyApplication.instance()).asGif().apply(optionsGif).listener(listener).load(url).into(imgView);
    
//加载监听
  private RequestListener listener = new RequestListener() {
        @Override
        public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) {
            return false;
        }

        @Override
        public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) {
            //这里设置加载一次与否
//            setLoadOnce(resource);
            return false;
        }
    };
//TODO 加载一次的设置
   private void setLoadOnce(Drawable resource) {
        // Glide 4.0 后没法再直接获取GifDecoder对象了,原因是因为GlideDrawable不再提供这个方法了。
        // 我这里是采用反射的方法获取到GifDecoder变量的,具体代码如下
        // 参考链接:https://www.aliyun.com/jiaocheng/1344.html
        try {
            Field gifStateField = GifDrawable.class.getDeclaredField("state");
            gifStateField.setAccessible(true);
            Class gifStateClass = Class.forName("com.bumptech.glide.load.resource.gif.GifDrawable$GifState");
            Field gifFrameLoaderField = gifStateClass.getDeclaredField("frameLoader");
            gifFrameLoaderField.setAccessible(true);
            Class gifFrameLoaderClass = Class.forName("com.bumptech.glide.load.resource.gif.GifFrameLoader");
            Field gifDecoderField = gifFrameLoaderClass.getDeclaredField("gifDecoder");
            gifDecoderField.setAccessible(true);
            Class gifDecoderClass = Class.forName("com.bumptech.glide.gifdecoder.GifDecoder");
            Object gifDecoder = gifDecoderField.get(gifFrameLoaderField.get(gifStateField.get(resource)));
            Method getDelayMethod = gifDecoderClass.getDeclaredMethod("getDelay", int.class);
            getDelayMethod.setAccessible(true);
            GifDrawable drawable = (GifDrawable) resource;
            // 设置只播放一次
            drawable.setLoopCount(1000);
            // 获得总帧数
            int count = drawable.getFrameCount();
            int delay = 0;
            for (int i = 0; i < count; i++) {
                // 计算每一帧所需要的时间进行累加
                delay += (int) getDelayMethod.invoke(gifDecoder, i);
            }
            handler.sendEmptyMessageDelayed(1, delay);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
    }

启迪原文:https://blog.csdn.net/xinpengfei521/article/details/72809013   侵删~Thanks!!!

你可能感兴趣的:(android)