本文基于郭神的Glide最全解析总结
Glide4.0基本用法
依赖(注意还要开启网络权限):
implementation 'com.github.bumptech.glide:glide:4.4.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.4.0'
Glide可以下载网络图片,加载本地图片,加载GIF格式的图片(Picasso不可以)。
Glide的使用非常简单,只用with(),load(),into()就可以完成基本功能,下面是从网上下载图片
Glide.with(this)
.load(url)
.into(imageView)
如果想设置占位符,或者网络加载失败的错误图片等功能,在Glide3中是把方法写在load和into中间,Glide4中是先设置一个RequestOptions对象,设置好你要的功能,然后在load和into中间插入一个apply方法。下面是设置一个占位符功能。
val requestOptions = RequestOptions.placeholderOf(R.drawable.ic_launcher_background);
Glide.with(this)
.load(url)
.apply(requestOptions)
.into(imageView)
- with():作用就是创建一个RequestManager对象,这里因为生命周期要和应用程序的生命周期相同,如果with传入了一个非Application的话,就会创建一个隐藏的fragment来使得生命周期相同,这样子当activity被关掉后,以前加载的图片缓存都会给释放掉。
- load():将URL地址传进去后经过几个初始化操作得到一个DrawableTypeRequest,这个Request是Glide加载图片的执行单位。
- into():Request的父类GenericRequestBuilder中包含了大量操作的实现方法,比如网络异步加载,图片解析,图片压缩等。最后展示在你传送的控件里。
Glide加载
Glide加载图片是根据imageView的大小来加载的,这样子就不用下载完整的图片,而是根据imageView的大小来下载一样大小的照片,降低了内存浪费。如果我有一个300 * 400的imageView,还有一个200 * 300的imageView,两个去加载同一张网络图片,glide会下载两次图片,缓存这两张图片。
如果是picasso,则是下载一张网上完整的图片,也就是像素和原图一样的,占用内存比较多。
Glide缓存机制
有内存缓存和磁盘缓存,内存缓存主要防止将重复的图片读入内容,硬盘缓存是为了防止从网络或者其他地方重复下载图片。内存缓存又分为软引用缓存(用HashMap存储),Lru缓存(用LinkedHashMap存储)。想要获取到内存缓存,有loadFromCache方法和loadFromActiveResources方法。
在glide4之后的版本,先调用loadFromActiveResources方法来获取软引用缓存,获取到就回调,获取不到的话就会调用loadFromCache方法来获取Lru缓存,如果有想要的照片就回调并且把他加到软引用中,同时从Lru缓存中移除。没有的话就开启线程去获取图片。
这里有一个acquire变量用来记录图片的引用次数,如果大于0,要放到软引用中,说明还在用。如果等于0的话,就去将这张图片从软引用中移除,然后放到Lru缓存中。
磁盘缓存
磁盘缓存用到了Lru算法,一般会先调用decodeFromCache方法来读取缓存里面的图片,没有再调用decodeFromSource方法来读取原始图片。原始图片取出后会进行转换。