项目中由于用到了视屏的展示,在视屏列表页面产品提出做一个类似其他视屏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<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> 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!!!