美文网首页
Glide源码学习笔记

Glide源码学习笔记

作者: 南歌ccc | 来源:发表于2018-11-16 14:51 被阅读16次

    本文是基于郭霖glide源码解析系列的学习笔记,在此记录一下。

    一、fragment巧用:

    使用没有界面的fragment来进行生命周期的控制,活用fragment,这个技巧在很多开源框架上都有使用,自己在项目中也有用到,确实不失为一种解决某些问题的好方法;

    二、glide缓存机制原理:

    内存缓存:

    一个是弱引用来缓存正在使用中的图片,一个是LruCache来缓存使用过的图片。

    采用计数的方式,当acquired变量大于0的时候,说明图片正在使用中,也就应该放到activeResources弱引用缓存当中。

    而经过release()之后,如果acquired变量等于0了,说明图片已经不再被使用了,就会将弱引用从map中移除,如果设置了缓存,

    就会再将它put到LruResourceCache当中。

    磁盘缓存:

    缓存原始图片 or 缓存转换过的图片(默认),硬盘缓存的实现也是使用的LruCache算法,原始图片和转换过的图片只是缓存的key不一样,

    原始图片的key使用的是图片url,转换过的图片使用的是一堆参数生成的key。

    三、高级技巧:

    1.学习了glide缓存机制,知道缓存原理使用的key是图片url或者根据url等一系列参数生成的,如果url后面拼接了类似token的数据,那么图片url就会动态改变了。

    因此glide缓存机制就失效的,为此我们通过读取源码发现,可以通过创建一个自己的GlideUrl,重写getCacheKey()方法,在load的时候传入即可。

    2.获取图片对象GlideDrawable等,可以重写Target类,提供的有SimpleTarget。

    3.预加载,preload()方法,原理是执行一遍什么都不做就可以了。

    4.下载图片,downloadOnly(int width, int height)  和 downloadOnly(Y target) 方法,前者需要在子线程执行,因为在执行过程中会阻塞线程,直到返回结果。后者需要重写一个实现Target接口的类。

    5.变换,重写一个类继承BitmapTransformation,重写transform方法;参考glide-transformations 开源库

    6.自定义模块,替换glide里的策略模式,如缓存策略、网络请求策略

    四、listener监听机制:

    类似冒泡式传递,onResourceReady()方法和onException()方法都有一个布尔值的返回值,返回false就表示这个事件没有被处理,还会继续向下传递,返回true就表示这个事件已经被处理掉了,从而不会再继续向下传递。举个简单点的例子,如果我们在RequestListener的onResourceReady()方法中返回了true,那么就不会再回调Target的onResourceReady()方法了。

    相关文章

      网友评论

          本文标题:Glide源码学习笔记

          本文链接:https://www.haomeiwen.com/subject/kgrmfqtx.html