最近抽空整理成了Module方式 GitHub地址
GlideGifLibs

最近由于要所有图片上支持gif的展示,结果在界面上显示3张gif图后cpu飙升到了90%,一会手机就烫手了。想了很多种办法 比如监听view的显示或者隐藏状态然后再来控制GIF的播放与暂停。但是都未能很好的实现。网上也查询了很多关于view的进入或退出屏幕的监听,但是都未能找到。要么就是不能通用的进行判断。搞了几天也没找到解决办法就想到了为何不去问问Glide作者呢。问之前我先搜索了下是否有人已经提出过该问题,结果发现已经有人提出过该问题。而且也给出了解决方案连接如下连接地址

我下载了连接中的demo发现cpu控制在30%左右。而且发现当gif图的控件移除屏幕后会自动停止gif的播放进入时会重新播放。原理大概是因为FrameSequenceDrawable继承至Drawable.drawable与View相关联 查看ImageView源码发现

 @Overrideprotected void onAttachedToWindow() {super.onAttachedToWindow();// Only do this for old apps pre-Nougat; new apps use onVisibilityAggregatedif (mDrawable != null && sCompatDrawableVisibilityDispatch) {mDrawable.setVisible(getVisibility() == VISIBLE, false);}}@Overrideprotected void onDetachedFromWindow() {super.onDetachedFromWindow();// Only do this for old apps pre-Nougat; new apps use onVisibilityAggregatedif (mDrawable != null && sCompatDrawableVisibilityDispatch) {mDrawable.setVisible(false, false);}}

在view被添加上屏幕和移除屏幕时都会重新设置drawable的显示状态达到不在屏幕区域中的GIF图停止播放。

然后根据Glide作者提供的自定义解码器sample来编写我们自己的Gif解码器 现在我们选用FrameSequence。

public class GifDecoder implements ResourceDecoder<InputStream,FrameSequence> {@Overridepublic Resource<FrameSequence> decode(InputStream source, int width, int height) throws IOException {try {FrameSequence fs = FrameSequence.decodeStream(source);return new SimpleResource<>(fs);} catch (Exception e) {throw new IOException("Cannot load gif from stream", e);}}@Overridepublic String getId() {return "com.move.gifdecoder";}
}
public class GifDrawableTranscoder implements ResourceTranscoder<FrameSequence,FrameSequenceDrawable> {@Overridepublic Resource<FrameSequenceDrawable> transcode(Resource<FrameSequence> toTranscode) {FrameSequenceDrawable drawable = new FrameSequenceDrawable(toTranscode.get());return new MyResource<>(drawable);}@Overridepublic String getId() {return "";}
}
public class GifSoftwareLayerSetter<T> implements RequestListener<T, FrameSequenceDrawable> {@Overridepublic boolean onException(Exception e, T model, Target<FrameSequenceDrawable> target, boolean isFirstResource) {ImageView view = ((ImageViewTarget<?>) target).getView();if (Build.VERSION_CODES.HONEYCOMB <= Build.VERSION.SDK_INT) {view.setLayerType(ImageView.LAYER_TYPE_NONE, null);}return false;}@Overridepublic boolean onResourceReady(FrameSequenceDrawable resource, T model, Target<FrameSequenceDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {ImageView view = ((ImageViewTarget<?>) target).getView();if (Build.VERSION_CODES.HONEYCOMB <= Build.VERSION.SDK_INT) {view.setLayerType(ImageView.LAYER_TYPE_SOFTWARE, null);}return false;}
}

调用方法

fun displayGif(context: Context, url: String, targeView: ImageView) {val uri = Uri.parse(url)getRequestManager(context).using(Glide.buildStreamModelLoader(Uri::class.java, context), InputStream::class.java).from(Uri::class.java).`as`(FrameSequence::class.java).transcode(GifDrawableTranscoder(), FrameSequenceDrawable::class.java).sourceEncoder(StreamEncoder()).cacheDecoder(FileToStreamDecoder(GifDecoder())).decoder(GifDecoder()).listener(GifSoftwareLayerSetter<Uri>()).diskCacheStrategy(DiskCacheStrategy.SOURCE).load(uri).into(targeView)}

这样就能用我们自己写的解码器去加载gif。

最近又写朋友问我要demo 趁着有空就顺手写了一下附上链接地址
demo地址

Glide 加载Gif 导致cpu居高不下的解决办法相关推荐

  1. office加载MathType导致启动超慢解决办法记录

    前一阵升级到了win11,结果不知为啥word打开时候加载特别慢,原因是mathType7加载慢(打开的时候word上边弹出该加载项加载时间过长的提醒,问是否要把mathTypeCommands.20 ...

  2. Dreamweaver8加载站点缓存时卡死,解决办法:

    Dreamweaver8加载站点缓存时卡死,解决办法: 无论中文版的 dreamweaver 8,还是英文版本的dw8或绿色版本的DW8,都可能出现无法启动的情况,这个bug的出现是因为先前你曾经在使 ...

  3. WordPress网站加载WAITING (TTFB) 时间过长解决办法

    WordPress 刚刚安装的时候,性能是没问题的,我们安装了主题.插件.添加了一些小工具和菜单,然后我们就开始上传内容了,我们都很勤快 Waiting (TTFB) 时间 Time to First ...

  4. VB6不能加载MSCOMCTL.OCX最简单的解决办法

    VB6不能加载MSCOMCTL.OCX最简单的解决办法 分类: Windows平台 VB6不能加载MSCOMCTL.OCX最简单的解决办法,好用到不得了!! ━━━━━━━━━━━━━━━━━━━━━ ...

  5. an....软件一直在加载,打不开的解决办法

    an-软件一直在加载,打不开的解决办法. utf-8编码解决大部分windows 软件抽风问题 将电脑设置成utf8编码

  6. 错误: 加载主类 时出现 LinkageError 解决办法

    错误: 加载主类 时出现 LinkageError 解决办法 在导入本地项目,运行的时候,发生了错误: 加载主类 时出现 LinkageError 的错误,搜索了很多种方法,都没有办法解决,后来,自己 ...

  7. Android高工面试:用Glide加载Gif导致的卡顿,说一下你的优化思路

    前言 Glide图片框架是可以直接加载GIF图的,但是做一个银行合作项目的时候,由于有需要出货页面需要加载一个GIF图,但是发现在使用Glide框架加载Gif图片,明显发现有延迟. 经过查看glide ...

  8. java关闭ie提示错误_IE或软件加载页中提示脚本错误的解决办法集合

    好多朋友发现IE经常出现错误提示,一般的软件中加载页面的也经常出现这个问题,例如flashget,迅雷,联众世界,QQ中,不一定是因为我们自身的问题,有可能是他们的程序出错 IE脚本错误 flashg ...

  9. Bootstrap 模态对话框只加载一次 remote 数据的解决办法

    前端框架 Bootstrap 的模态对话框,可以使用 remote 选项指定一个 URL,这样对话框在第一次弹出的时候就会自动从这个地址加载数据到 .modal-body 中,但是它只会加载一次,不过 ...

最新文章

  1. strcpy()和memcpy()的区别
  2. 针对OAuth2的CSRF攻击
  3. [C++11]decltype在泛型编程中的使用举例
  4. android q升级名单,华为升级 Android Q 机型名单敲定 阵容庞大
  5. springboot整合视图层之freemarker
  6. 产品管理有行业特殊性吗
  7. # bucketSort 箱排序 也称桶排序
  8. 搞定所有的跨域请求问题 : jsonp CORS
  9. ffmpeg 命令转vp9
  10. 计算机专业班级网站,计算机专业班级标语
  11. golang slices使用和原理
  12. redis知识盘点【陆】_客户端Jedis
  13. Java 代码 各种不规范示范,希望引以为戒,望看到的大哥们 都能把代码写的规范点,方便你我他。
  14. Android之如何分析手机系统相册图片和视频删除后保存的位置
  15. 软件教父马丁.福勒的心灵鸡汤
  16. 《版权与版权贸易》第二章 版权的内容
  17. 书籍推荐!张磊首部力作《价值》
  18. 改善反激电源交叉调整率
  19. 三国志战略版:Daniel_颜良分析
  20. 2021 年 15 个受欢迎的 CMS 平台(比较)

热门文章

  1. 服务器Reboot以后无法重启的一个原因
  2. Waiting (TTFB)
  3. 学生邮箱添加到macOS上的outlook邮箱客户端里。
  4. 谷歌SEO站内高级优化技巧
  5. 数控行业还有前途吗?
  6. 免费视频直播、点播H5播放器SkeyeWebPlayer 结合百度地图sdk实现电子地图播放功能
  7. 真金白银交互大机构投资的 Slingshot,埋伏空投
  8. 经典题目:求一个一元二次方程的解
  9. Spring AOP代码实现:实例演示与注解全解
  10. LCR数字电桥测量兆欧级高阻值抗电阻的原因分析