当前位置: 首页 > news >正文

Android Glide(一):源码分析,内存缓存和磁盘缓存的分析,实现流程以及生命周期

目录

在这里插入图片描述


一、Android Glide是什么,如何使用?

Android Glide是一个由Google维护的快速高效的Android图像加载库,它旨在简化在Android应用程序中加载和显示图像的过程,包括内存缓存、磁盘缓存和网络加载,以确保图像加载的快速和流畅。

Glide.with(this).load("http://xxx").into(ivProcode);

设置的很简单,提供url以及ImageView。

但如果只是会使用,那么对我们的技术是没有什么提升的,所以这篇文章,我们就来看看他的底层实现是怎么样的。


二、Glide的大体实现流程图

我们会发现,使用Glide,会有一个非常强大的缓存功能。比如下图

在这里插入图片描述
我们要展示一张图片,从http进行请求:

Glide.with(this).load("http://xxx").into(ivProcode);

那么它就会先问活动缓存有没有,内存缓存有没有,磁盘缓存有没有,如果都没有(第一次的时候就会都没有),那么就会发起http请求,将图片数据拿到,然后放到磁盘缓存,然后再放到活动缓存里面。然后展示到imagView里面。

在这里插入图片描述
如果下一次还是这个请求,那么就会从活动缓存里面直接拿,所以我们发现第二次展示图片的时候,就会非常快。
在这里插入图片描述

所以从这里我们可以知道,这个缓存,其实是一个key-value,因为它要存储你的图片地址信息(会根据你的url进行加密得出key),以及图片内容。

为什么会有活动缓存和内存缓存?他们的区别是什么,为什么要搞两个?


三、活动缓存、内存缓存以及磁盘缓存的区别

通过三级缓存机制(活动缓存、内存缓存和磁盘缓存)来优化图像加载过程,以提高加载速度和减少网络请求。以下是这三种缓存机制的区别:

3.1 活动缓存

活动缓存主要存储什么?只要存储正在显示的图片!!!

活动缓存的作用范围限定在单个Activity或Fragment的生命周期内。当页面退出或资源不再被使用时,相应的缓存会自动清除。

活动缓存的主要目的是分担内存缓存的负担,及时释放内存资源,避免整个应用退出时才释放内存。它的大小相对较小,如果活动缓存满了,会自动将部分数据写入内存缓存。

3.2 内存缓存

内存缓存的作用范围是整个应用程序。只要应用程序没有完全退出,内存缓存中的数据就会保持有效。

但是,由于内存资源有限,因此内存缓存的大小会受到限制。Glide默认使用LRU(最近最少使用)策略来管理内存缓存,确保最近使用或最频繁使用的图片数据能够保留在内存中。

所以,这也是为什么会有活动缓存的原因,如果App显示了很多图片,有些在界面显示,但是又刚好满足LRU策略被回收掉了怎么办,那么再次使用就会出现问题。所以会将正在显示的图片,放到活动缓存里面,活动缓存没有LRU策略。

3.3 磁盘缓存

上面介绍的内存缓存和活动缓存,都是运行时缓存,断电就没了。

磁盘缓存是将图片数据存储在设备的本地磁盘上的一种缓存机制。它的作用范围是整个系统。只要磁盘上的数据没有被删除,那么它就可以一直被访问。

磁盘缓存的容量相对较大,可以存储更多的图片数据。但是,由于磁盘读写速度较慢于内存,因此磁盘缓存的访问速度相对较慢。不过,对于已经加载过的图片数据来说,磁盘缓存可以显著减少网络请求和加载时间。

接下来,我们看看源码,从with方法开始看起。


四、with方法分析(生命周期)

这里会判断是否为子线程,如果是子线程,那么添加的生命周期,就是Application的
在这里插入图片描述如果不是子线程,那么添加的就是页面的生命周期。主线程才会创建一个空白的Fragment监听Activity Fragment的变化。
在这里插入图片描述但,为什么要做一个增加生命周期?因为我们要在页面切换的时候,清理掉活动缓存,释放资源。添加空白的Fragment的原因,是因为Fragment会根据Activity的销毁而自动销毁,也就是会自动调用onstop这些生命周期方法。

如果不添加空白的Fragment,那么就需要写到Activity的onStop方法里面,如果万一忘记了呢,并且这个操作给用户来,是不方便的。

总结:with流程主要涉及到根据传入的上下文获取或创建一个RequestManager对象,并将该对象的生命周期与上下文的生命周期绑定在一起。这个流程是Glide图片加载机制的重要组成部分,它确保了图片加载请求的高效管理和生命周期的正确处理。


五、load流程分析

是一个构建和配置加载请求的过程。它通过load(…)方法接收资源标识符,并通过RequestBuilder对象提供的方法配置请求参数。

glide支持多种图片的来源,包含url、本地文件、资源ID等等,从而会重写不同参数类型的load()方法。

最终,在into(…)方法被调用时,构建好的加载请求会被添加到请求队列中,等待执行。

load总结: 其实也就是一些初始化的创建工作,最后获取RequestBuilder。


六、into流程分析

into流程负责将加载的图片显示到指定的视图。比如会读取在布局中imageView的参数,进行设置,测量宽高等等,进行参数的设置,然后将图片显示。
在这里插入图片描述

Engine: 图片加载的引擎,负责管理内存缓存和磁盘缓存。

  1. ActiveResources: 活动缓存,存储当前界面使用到的图片。界面不展示后,该Bitmap又被缓存至MemoryCache中,并从ActiveResources中删除。
  2. MemoryCache: 内存缓存。当MemoryCache中得到Bitmap后,该Bitmap又被缓存至ActiveResources中,并从MemoryCache中删除。
  3. DiskCache: 磁盘缓存。

在这里插入图片描述
在这里插入图片描述
这篇文章就先介绍这里。

相关文章:

  • SCAU学习笔记 - 面向对象程序设计课后习题
  • hive如何删除分区
  • “避开死锁泥潭:开发者必知的技巧与工具“
  • 提升SAP归档效率的5个实用技巧
  • 智慧城市交通管理中的云端多车调度与控制
  • uniapp数据缓存
  • C#源码安装ZedGraph组件,并且立即演示使用
  • GIS在构建虚拟世界中的新机遇
  • 滚雪球学MySQL[1.1讲]:MySQL简介与环境配置
  • el-upload自定上传列表删除,上传列表已删除,提交数据仍存在问题
  • 什么情况?上交所服务器被你们给买崩了?
  • 将Mixamo的模型和动画导入UE5
  • Android OpenGLES2.0开发(三):绘制一个三角形
  • 全方位助力“生活家”丨约克VRF中央空调UDIII舒享系列引领美好生活新潮流
  • Leetcode面试经典150题-39.组合总数进阶:40.组合总和II
  • canvas 绘制双线技巧
  • JavaScript 基本功--面试宝典
  • Just for fun——迅速写完快速排序
  • Laravel 实践之路: 数据库迁移与数据填充
  • Rancher-k8s加速安装文档
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 关于List、List?、ListObject的区别
  • 观察者模式实现非直接耦合
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 回顾 Swift 多平台移植进度 #2
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 解决iview多表头动态更改列元素发生的错误
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 目录与文件属性:编写ls
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何在 Tornado 中实现 Middleware
  • 数据仓库的几种建模方法
  • 微信公众号开发小记——5.python微信红包
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 06-01 点餐小程序前台界面搭建
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​你们这样子,耽误我的工作进度怎么办?
  • #android不同版本废弃api,新api。
  • #define、const、typedef的差别
  • #if等命令的学习
  • (1)(1.11) SiK Radio v2(一)
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (floyd+补集) poj 3275
  • (poj1.3.2)1791(构造法模拟)
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (八十八)VFL语言初步 - 实现布局
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)计算机毕业设计ssm本地美食推荐平台