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查找当前是否有对应的活跃图片,没有则查找内存缓存,没有则查找资源类型,没有则查找数据来源。

缓存查找.png

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

第一层 活动资源

当需要加载某张图片能够从内存缓存中获得的时候,在图片加载时主动将对应图片从内存缓存中移除,加入到活动资源中。
这样也可以避免因为达到内存缓存最大值或者系统内存压力导致的内存缓存清理,从而释放掉活动资源中的图片(recycle)。
活动资源中是一个”引用计数"的图片资源的弱引用集合。

因为同一张图片可能在多个地方被同时使用,每一次使用都会将引用计数+1,而当引用计数为0时候,则表示这个图片没有被使用也就是没有强引用了。这样则会将图片从活动资源中移除,并加入内存缓存。

加入内存缓存.png

第二层 内存缓存

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

LRU在Android support-v4中提供了LruCache工具类。

LruCache.png

构造LinkedHashMap的accessOrder设置为true。在使用的此map的时候,自动进行排序(每次get/put,会将使用的value放入链表header头部)。LruCache会在每次get/put的时候判断数据如果达到了maxSize,则会优先删除tail尾端的数据。

LRU.png

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

第三、四层 磁盘缓存

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

Bitmap复用

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

复用前.png

复用后.png

复用效果如上。在未使用复用的情况下,每张图片都需要一块内存。而使用复用的时候,如果存在能被复用的图片会重复使用该图片的内存。
所以复用并不能减少程序正在使用的内存大小。Bitmap复用,解决的是减少频繁申请内存带来的性能(抖动、碎片)问题。
developer.android.google.cn/topic/perfo…

设置inBitmap复用.png
获得可复用Bitmap.png
检查Bitmap是否可复用.png

Google给出的案例可以看出:
使用方式为在解析的时候设置Options的inBitmap属性。

  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释放。

转载于:https://juejin.im/post/5c1b5be7e51d45401f668bb4

Glide 缓存与解码复用相关推荐

  1. 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 内存复用 | 弱引用 | 引用队列 | 针对不同 Android 版本开发不同的 Bitmap 复用策略 | 工具类代码 )

    文章目录 一.Bitmap 复用池 二.弱引用 Bitmap 内存释放 三.从 Bitmap 复用池中获取对应可以被复用的 Bitmap 对象 1.Android 2.3.3(API 级别 10)及以 ...

  2. Glide系列(四) — Glide缓存流程分析

    文章目录 一.概述 1.1 背景 1.2 系列文章 二.准备知识 2.1 Glide 的缓存分层结构 2.2 Glide 缓存相关类的关联关系 三.缓存的获取流程 3.1 缓存获取的入口 3.2 内存 ...

  3. Glide缓存图片流程浅析

    如果没有缓存,在大量的网络请求从远程获取图片时会造成网络流量的浪费,尤其是面对高清大图的加载更是如此,为了节省带宽,也为了减少用户等待的时间,合理的缓存方式必不可少,这也是Glide图片框架的强大之处 ...

  4. Glide 缓存策略 内存缓存和磁盘缓存

    感恩原创:http://www.cnblogs.com/baiqiantao/p/6808457.html Glide 缓存策略 内存缓存和磁盘缓存 官方文档:https://github.com/b ...

  5. android glide的历史,Android 图片加载的那些事:为什么你的Glide 缓存没有起作用?...

    前言Glide,该功能非常强大 Android  图片加载开源框架 相信大家并不陌生 正由于他的功能强大,所以它的源码非常复杂,这导致很多人望而却步 本人尝试将 Glide 的功能进行分解,并单独针对 ...

  6. Android Glide缓存策略

    一.glide缓存策略 缓存在请求网络图片时能减少不必要的流量浪费.Glide 缓存分为内存缓存和硬盘缓存,这两个缓存模块的作用各不相同,内存缓存的主要作用是 防止应用重复的将图片数据读取到内存,而硬 ...

  7. android自定义Glide图片加载(以更改Glide缓存路径和使用ARGB_8888的图片格式为例)

    首先引入Glide: compile 'jp.wasabeef:glide-transformations:2.0.1' 自定义GlideModule package tsou.cn.glidetes ...

  8. Glide 缓存机制解析(为啥使用弱引用)

    目前图片框架,基本就是 Glide 一统江山了,除了极其简单的链式调用,里面丰富的 API 也让人爱不释手. 那么,这样一个好用的框架,里面的缓存机制是怎么样的呢? 我们知道,一般图片框架,加载图片, ...

  9. 读万卷书行万里路,笔试越来越少,到底怎样才能拿到offer?

    经过一个多月的笔试高峰期,从这个星期开始,大厂笔试终于结束了,只剩一些小厂陆陆续续的还有一些小规模笔试,各位监考官们终于可以松一口气了. 但是,监考官松口气的同时你应该能感受到求职危机又加重了一层 危 ...

  10. Glide Picasso Fresco UIL 图片框架 缓存 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

最新文章

  1. 2022-2028年中国橡胶带行业市场运营格局及未来前景分析报告
  2. [Android官方API阅读]___Application Fundamentals
  3. Spring和SpringMVC的父子容器关系
  4. 他人评审18篇SCI文章的一点感受
  5. android room表关联,如何在首次运行时填充Android Room数据库表?
  6. HTTP WS 区别
  7. 在Simulink中设计多工位的系列PID控制器Design Family of PID Controllers for Multiple Operating Points
  8. mysql主从的原理_Mysql主从的原理
  9. div中文字居中加粗
  10. 成为java高手的八大条件
  11. WS2812B全彩LED驱动
  12. 小程序包大小超过限制
  13. Android 10 深色模式适配
  14. 驱动精灵等软件卸载后剩余文件的删除
  15. 文章-编程需要知道多少数学知识?
  16. 神经网络训练样本太少,神经网络常用训练方法
  17. Leetcode494. 目标和
  18. 计算机网络:网间互联协议
  19. c罗图片带字经典语言,20条经典的唯美的图片带字-感人的情话
  20. C语言规定 定义符号常量时必须用大写字母,C语言规定,定义符号常量时必须用大写字母()...

热门文章

  1. myeclipse 8.0GA 安装注册步骤
  2. Vue知识点笔记(基础篇)
  3. ES6学习笔记对象的扩展(补充)
  4. SQLite数据库的使用——利用命令行或Navicat Premium创建数据库
  5. gridreport php教程,谁能教我怎样才能把Grid++Report插件插入到.w页面中?
  6. mysql 错误的字符串值_这次被坑惨了,MySQL的隐式转换导致了一个线上BUG
  7. Bootstrap模态框的基本使用(复制可用)
  8. iis服务器网站指向ip地址,IIS之Web服务器 一个IP地址对应多个Web站点 多个域名...
  9. html下拉菜单的某个值被选定,使用JavaScript在下拉列表中获取选定的值?
  10. 调度流程图_怎么做大数据工作流调度系统?大厂架构师一语点破!