Glide 缓存与解码复用

栏目: 数据库 · 发布时间: 6年前

内容简介:LRU.png

Glide 使用简明的流式语法API,大多数情况下,可能完成图片的设置你只需要:

Glide.with(activity) .load(url) .into(imageView);

默认情况下,Glide 会在开始一个新的图片请求之前检查以下多级的缓存:
1. 活动资源 (Active Resources) 
2. 内存缓存 (Memory Cache) 
3. 资源类型(Resource Disk Cache)
4. 原始数据 (Data Disk Cache)

活动资源:如果当前对应的图片资源正在使用,则这个图片会被Glide放入活动缓存。
内存缓存:如果图片最近被加载过,并且当前没有使用这个图片,则会被放入内存中
资源类型:  被解码后的图片写入磁盘文件中,解码的过程可能修改了图片的参数(如:inSampleSize、inPreferredConfig)
原始数据:  图片原始数据在磁盘中的缓存(从网络、文件中直接获得的原始数据)
复制代码
在调用into之后,Glide会首先从Active Resources查找当前是否有对应的活跃图片,没有则查找内存缓存,没有则查找资源类型,没有则查找数据来源。 Glide 缓存与解码复用

缓存查找.png

相较于常见的内存+磁盘缓存,Glide将其缓存分成了4层。

第一层 活动资源

当需要加载某张图片能够从内存缓存中获得的时候,在图片加载时主动将对应图片从内存缓存中移除,加入到活动资源中。

这样也可以避免因为达到内存缓存最大值或者系统内存压力导致的内存缓存清理,从而释放掉活动资源中的图片(recycle)。

活动资源中是一个”引用计数"的图片资源的弱引用集合。

Glide 缓存与解码复用

加入内存缓存.png

第二层 内存缓存

内存缓存默认使用LRU(缓存淘汰算法/最近最少使用算法),当资源从活动资源移除的时候,会加入此缓存。使用图片的时候会主动从此缓存移除,加入活动资源。

Glide 缓存与解码复用

LruCache.png

Glide 缓存与解码复用

LRU.png

磁盘缓存同样使用LRU算法。

第三、四层 磁盘缓存

Resource 缓存的是经过解码后的图片,如果再使用就不需要再去进行解码配置(BitmapFactory.Options),加快获得图片速度。比如原图是一个100x100的ARGB_8888图片,在首次使用的时候需要的是50x50的RGB_565图片,那么Resource将50x50 RGB_565缓存下来,再次使用此图片的时候就可以从 Resource 获得。不需要去计算inSampleSize(缩放因子)。

Data 缓存的则是图像原始数据。

Bitmap复用

如果缓存都不存在,那么会从源地址获得图片(网络/文件)。而在解析图片的时候会需要可以获得BitmapPool(复用池),达到复用的效果。

Glide 缓存与解码复用

复用前.png

Glide 缓存与解码复用

复用后.png

复用效果如上。在未使用复用的情况下,每张图片都需要一块内存。而使用复用的时候,如果存在能被复用的图片会重复使用该图片的内存。

所以复用并不能减少程序正在使用的内存大小。Bitmap复用,解决的是减少频繁申请内存带来的性能(抖动、碎片)问题。

developer.android.google.cn/topic/perfo…
Glide 缓存与解码复用

设置inBitmap复用.png

Glide 缓存与解码复用

获得可复用Bitmap.png

Glide 缓存与解码复用

检查Bitmap是否可复用.png

Google给出的案例可以看出:

  1. Bitmap的inMutable需要为true。
  2. Android 4.4及以上只需要被复用的Bitmap的内存必须大于等于需要新获得Bitmap的内存,则允许复用此Bitmap。
  3. 4.4以下(3.0以上)则被复用的Bitmap与使用复用的Bitmap必须宽、高相等并且使用复用的Bitmap解码时设置的inSampleSize为1,才允许复用。

因此Glide中,在每次解析一张图片为Bitmap的时候(磁盘缓存、网络/文件)会从其BitmapPool中查找一个可被复用的Bitmap。

BitmapPool是Glide中的Bitmap复用池,同样适用LRU来进行管理。

当一个Bitmap从内存缓存 被动 的被移除(内存紧张、达到maxSize)的时候并不会被recycle。而是加入这个BitmapPool,只有从这个BitmapPool 被动

被移除的时候,Bitmap的内存才会真正被recycle释放。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Linux命令行大全

Linux命令行大全

绍茨 (William E.Shotts) / 郭光伟、郝记生 / 人民邮电出版社 / 2013-3-1 / 69.00元

《Linux命令行大全》主要介绍Linux命令行的使用,循序渐进,深入浅出,引导读者全面掌握命令行的使用方法。 《Linux命令行大全》分为四部分。第一部分开始了对命令行基本语言的学习之旅,包括命令结构、文件系统的导引、命令行的编辑以及关于命令的帮助系统和使用手册。第二部分主要讲述配置文件的编辑,用于计算机操作的命令行控制。第三部分讲述了从命令行开始执行的常规任务。类UNIX操作系统,比如L......一起来看看 《Linux命令行大全》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

MD5 加密
MD5 加密

MD5 加密工具