南充网站建设狐灵网络,python 网站架构,网站建设方案总结语,济南 网站 建设基于Glide做了图片显示的优化#xff0c;尤其是加载Gif图的优化#xff0c;原生Glide加载Gif图性能较低。在原生基础上做了自定义解码器的优化#xff0c;提升Glide性能 Glide加载大图和Gif 尤其是列表存在gif时#xff0c;会有明显卡顿#xff0c;cpu和内存占用较高… 基于Glide做了图片显示的优化尤其是加载Gif图的优化原生Glide加载Gif图性能较低。在原生基础上做了自定义解码器的优化提升Glide性能 Glide加载大图和Gif 尤其是列表存在gif时会有明显卡顿cpu和内存占用较高 Glide的优势 就是有一套图片生命周期的维护但是加载gif效率比不上android-gif-drawable库原因就是glide是java层加载的后者是native层加载的 使用的是giflib库 解决方案 Glidegiflib 因为giflib是C库我们调用比较不便好在Google官方封装好了一个 frameSequence 步骤一生成so文件 下载好framesequence和giflib包然后在framesequence目录中创建external目录并将giflib解码目录复制到该目录下然后执行ndk-build最后将生成的so放到jnilibs目录下。
步骤二创建FrameSequence对象以及FrameSequenceDrawable对象
frameSequence的sample项目中已有了直接复制过来就可以使用了 步骤三 自定义glide资源解码器
经过以上三步准备工作已做好接下来就是要将frameSequence和glide进行结合了。frameSequence负责图片解码glide负责下载和生命周期维护。想要替换解码部分就必须了解glide的实现了。glide加载过程分为加载和解码两大步骤其中加载过程是通过模型加载器(ModelLoader)来实现而解码过程是通过资源解码器(ResourceDecoder)来实现的所以我们要做的就是将glide的ResourceDecoder中默认的解码操作替换成frameSequence。 那应该怎么给glide注册一个资源解码器呢
其实Glide v4 使用 APT(注解处理器) 来生成出一个 API。可以为 Generated API 扩展自定义选项我们可以继承AppGlideModule重写registerComponents方法在里面添加一个gif解码器。注意需要使用GlideModule进行注解添加完该注解后在编译时会自动生成一些类。这里将glide.getBitmapPool传递到解码器中是为了bitmap的复用 写好这个类后我们直接编译一下项目就会发现glide自动为我们生成了很多的java文件如下图 接下来我们再看看核心的解码器需要做什么操作 我们可以看到这里面首先构造方法接收到了glide注册机传过来的bitmapPool用在decode方法中进行复用。在handles中返回true代表我们的解码器直接处理了该任务然后在最核心的decode方法中我们初始化了一个FrameSequenceDrawable并且返回。这里由于返回值是Resource所以我们不得不包了一层自定义的Resource子类。
什么是内存抖动
内存抖动是指频繁的申请内存然后又回收内存使得内存使用很不稳定万一没有回收好就会产生内存泄漏。
什么是内存碎片
在连续的内存空间中有一部分内存被使用另一部分已经被回收所以导致目前可使用的内存空间不是连续的而不是连续的将不可以同时一次性拿来使用。比如内存空间是1 2 3 4个格子其中1和3是正在使用的内存2和4是空闲内存此时如果2和4单个的内存空间不够那么就需要同时申请到2和4由于2和4的空间不连续所以就会导致申请失败。其中2和4这2个内存空间就被称为内存碎片太小的碎片将无法使用非常影响效率。
有关bitmapPool的复用
这里我贴出谷歌官方的2张图第一张是复用前每个图片都分配一个内存空间。第二张是复用后所有图片复用同一个bitmap空间减少内存使用。 步骤四 自定义解码器的使用
最后我们通过调用之前通过APT生成的GlideApp然后通过as方法传入FSDrawable的方式来调用我们自定义的解码器 是否还能优化一下调用流程
以上实际的加载优化已经完成但是我们发现调用的时候需要as方法传入FrameSequenceDrawable写起来很不方便希望能改成类似于asgif这种调用方法这个又需要使用到glide自带的APT技术了换句话说我们需要使用一个注解。这里我们新建一个类类名随意然后使用一下GlideExtension注解这里需要注意的是类中必须要有一个私有无参构造方法不然glide是会报错的。然后我们自定义一个asGif2方法使用GlideType进行标注在里面就调用requestBuilder.apply方法就好了。写完以后要编译一下让glide通过注解生成该方法这样就可以直接调用了。 总结glide优化其实就是指利用glide可以自定义解码器的特点我们自己来定义并且注册了一个资源解码器其中指定使用FrameSequence来进行解码核心其实就是使用的giflib库。利用native层来实现资源的解码提升了加载效率其中我们还特意对bitmap进行了复用。然后为了调用方便我们将调用方式从as改为asGif2调用更加清晰明了。