Glide使用及原理分析

Glide实现原理解析 一.Glide缓存机制 Glide采取的多级缓存机制,能够较为友好地实现图片、动图的加载。其主要有 内存缓存+磁盘缓存 ,当然他们的作用也有不同,其中内存缓存主要用于防止将重复的图读入内存中,磁盘缓存则用于防止从网络或者其他地方将重复下载和数据读取。 默认情况下,Glide 会在开始一个新的图片请求之前检查以下多级的缓存: 活动资源 (Active Resources) 内存缓存 (Memor... 阅读详情


前言

Glide是一款非常好用的图片加载框架那么它具体好用在哪里呢?

总所周知,在android开发中有几大令人头疼的问题,比如内存泄漏,线程问题,生命周期,这些问题在Glide的身上都不需要关心,下面就具体来介绍一下Glide的使用及原理吧。


一、Glide的基本使用

Glide.with(MainActivity.this)
                        .load(url)
                        .asGif()  // 加载gif图片
                        .placeholder(res)  // 加载成功前显示图片
                        .diskCacheStrategy(DiskCacheStrategy.NONE)  // 不使用Glide缓存
                        .error(res2) // 加载图片失败显示的图片
                        .into(imageView); // 显示图片

二、Glide的网络请求

1.HttpURLConnection实现一个原生图片加载框架

  • 子线程请求网络
  • 渲染UI
  • 切换到主线程
  • 将流转成Bitmap
  • Bitmap设置到imageView

Glide的网络请求也是HttpURLConnection

2.Glide为什么能监听网络变化

监听网络变化,重新进行一次网络请求restartRequests(),其中request.begin()

LRU算法:LinkedHashMap,双向链表,查询快,最近访问的元素在栈顶

切换线程Handler:EngineRunnable中切岛子线程,走三级缓存,若没有走网络请求,into之前切回主线程


三、Glide的生命周期

1.Fragment的生命周期,动态加载Fragment

Fragment生命周期

  • onAttach():关联之后调用

  • onCreate():Fragment初次创建时调用(不能去拿activity的UI控件)

  • onCreateView():设置fragment的view

  • onActivityCreated(): 可以拿activity的UI控件

activity先onCreate(),后onDestroy()

无UI的Fragment,没有视图,只是进行声明周期的监听

into时会判断是否为主线程

onDestroy()会清除内存,硬盘文件没有被清除

2.Glide如何管理管理生命周期

RequestManagerRetriever创建一个无UI的Fragment,传到Activity上,并将这个Fragment的生命周期绑定到RequestManager上

  • 如果当前页面停止,onStop()方法被调用,所有运行中的请求都会停止,加入到等待队列中,开始运行后,放回运行队列中

  • 当Activity调用onStop()时,隐式调用Fragment的onStop()方法,通过调用RequestManager,来管理两个队列的请求

3.Glide为什么要缓存Fragment

SupportRequestManagerFragment中缓存

1、防止每次都创建一个Fragment(复用)

2、当前Fragment放进去会把上一个Fragment移除(不会造成内存泄露)

3、多个activity时,防止多个Fragment导致管理生命周期紊乱,保证只有一个Fragment,保证Glide的生命周期和当前显示的Activity保持一致


四、Glide如何监测内存

在这里插入图片描述
Activity和Fragment中都有一个ComponentCallback接口,里面onTrimMemory方法(回调接口)

而Glide在RequestManagerFragment中监听onTrimMemory,onLowMemory中glide.clearMemory(),clearMemory中对内存缓存和BitmapPool进行清除

key不变,value变了,还是请求原来的图片(有缓存)


五、Glide的三大主线

Glide.with(this).load(url).into(iv_image1);

主线

1.Glide的with主线

  • new一个Glide对象:build构建者模式

  • 创建了一个空Fragment:绑定生命周期实现了Lifecycle接口

  • 把生命周期方法传导出去

2.Glide的load主线

构建RequestBuilder对象,把Url传进去

3.Glide的into主线

  • engine.load中三级缓存(EngineKey)

    • 活动缓存(Hashmap)(弱引用缓存)

    • 内存缓存(Lru算法)

    • 磁盘缓存(Lru算法)

  • 从主线程切换到子线程去请求网络数据

  • 切回主线程

  • 主线程渲染数据

  • 图片裁剪,自适应


六、Glide三大缓存

通过key值去取,存的时候把key存进去

  • 活动缓存:针对当前activity有效,activity被干掉就没了

  • 内存缓存:针对当前app有效(Lru,有数量限制)

  • 磁盘缓存:app没被卸载就有效

1、手写活动缓存(activityCache):get,set,remove

  • Lru无法识别特殊字符串,通过算法将url转成一个key

  • 不能一边遍历,一边删除,数组长度变化,会下标越界

  • 删除:通过迭代器去删除

2、手写内存缓存(memoryCache):继承Lruche,设定一个最大值

3、手写磁盘缓存(DiskLruCache):io交互,内存问题,算法

  • 单例模式,文件路径,DiskLruCache,get,put

4、Engine引擎:读取缓存,读取逻辑,事件分发给EngineJob

  • 从服务器读取图片之后存到磁盘缓存,当前activity可见存到活动缓存(弱引用持有数据,不会造成OOM),不可见存到内存缓存

  • 读取逻辑:

    • 先找活动缓存,活动缓存中有,存入内存缓存,活动缓存中删除

    • 没有,找内存缓存,内存缓存中有,存入活动缓存,内存缓存中删除(相互互补互删)

    • 没有,去找磁盘缓存

  • EngineJob:继承自Runnable,做网络请求

5、活动缓存和内存缓存区别

  • 作用域不同

  • 内存缓存有maxSize

6、Glide缓存会缓存两份,不是三份

7、Glide存是若没有设置大小,会存一个和手机分辨率匹配的图片


总结

Glide整体流程:
在这里插入图片描述

Glide原理之史上最全的(一) **前言 Glide 基本用法 接下来的讲解将基于 Glide 目前的最新版本 4.11。 Glide 的使用特别简单,首先添加依赖。** with() 可以传 Applicaiton、Activity 、Fragment 与 view 等类型的参数,加载图片的请求会与该参数的生命周期绑定在一起。 load() 可以传图片的网络地址、Drawable 等。 into() 一般传 ImageView 。 内容概览 Glide 加载图片大致可分为三个步骤。 发起加载图片请求 当我们用 into() . 阅读详情

相关推荐

Glide原理之史上最全的(二)

Glide 缓存原理 Glide 使用了三级缓存机制,图片的缓存分为内存、磁盘和来源,也就是从内存获取不到图片时,再去磁盘获取图片,从磁盘获取不到图片时,再从图片来源获取图片。 三级缓存的优势在于节省流量和内存,如果不用三级缓存,每次都从服务端获取图片的话,图片消耗的流量就会非常多,如果把所有图片都放在内存的话,那就有可能发生 OOM 。 下面我们来看下 Glide 的内存缓存原理、磁盘缓存原理和磁盘缓存策略。 3.1 Glide 内存缓存原理 前面提到 Engine 的 load() 方法会先在内存缓存中

chengxuyuan22的博客 1758

Glide的使用

Glide的使用

xiaokang666的博客 2632

Glide源码原理分析

Glide原理 With:当上下文对象传入的是非全局context,如果glide运行在非UI线程,使用全局上下文,如果glide在UI线程加载图片,因为activity的生命周期和UI线程并不完全同步,所以glide无法准确得知寄存体的生命周期, 因此glide底层创建出一个不可见fragment,而fragment的生命周期和activity同步,所以当activity 销毁(ondestory)的时候,停止glide图片加载。 如果是全局上下文,那么glide加载图片跟随application的.

weixin_54429979的博客 355

Android Glide使用详解

Glide 是一个快速高效的 Android 开源媒体管理和图像加载框架,它将媒体解码、内存和磁盘缓存以及资源池封装到一个简单易用的界面中。 Glide 支持拉取,解码和展示视频快照,图片,和GIF动画。 Glide的Api十分灵活,开发者甚至可以插入和替换成自己喜爱的任何网络栈。默认情况下,Glide使用的是一个定制化的基于HttpUrlConnection的栈,但同时也提供了与Google Volley和Square OkHttp快速集成的工具库。

帅次的博客 1万+

Android Glide使用姿势与原理分析_安卓 glide

自定义图片压缩策略通过实现接口实现。该接口包含方法,可以在其中定义自定义的压缩操作。// 自定义压缩算法return "customTransformation" // 返回唯一标识符,用于缓存// 自定义压缩算法实现// ....load(url)通过实现接口,你可以根据需求制定不同的压缩算法,以满足特定的图片压缩需求。

2501_90390118的博客 1712

Diffusion、VAE与GAN:三大生成模型的原理对比与应用场景解析

本文深入解析了Diffusion、VAE与GAN三大生成模型的核心原理与特性。Diffusion模型通过逆向去噪过程实现高质量图像生成,但计算成本较高;VAE擅长学习概率潜空间,训练稳定但图像偏模糊;GAN通过对抗训练生成锐利图像,但存在模式崩溃风险。文章结合实战场景,为图像生成、修复、超分辨率等任务提供了清晰的模型选择指南。

weixin_29063979的博客 342

Android Glide使用姿势与原理分析

简介Android Glide是一款强大的图片加载库,提供了丰富的功能和灵活的使用方式。本文将深入分析Glide的工作原理,并介绍一些使用姿势,助你更好地运用这个优秀的库。原理分析Glide的原理复杂而高效。它首先基于给定的图片URL或资源ID进行加载,支持多种数据源,包括网络请求、本地文件和ContentProvider...

weixin_40971035的博客 167

MATLAB机械臂轨迹规划:在关节空间中生成多项式轨迹以及 jtraj函数(内容超详细讲解)

matlab机器人仿真,关节空间多项式轨迹生成

qq_40969179的博客 1万+

Glide原理分析

glide调用方法比较简单如下,这是一个最简单的例子,后续流程分析就按照这个例子来: Glide.with(this).load("http://u5.mm-img.mmarket.com/rs/res2/marketing_activities/1513240903060.png" 1.Glide的基本加载流程 1.1几个重点类的解释 Glide:glide图片加载的入口类,里面维护着它...

lanhuzi9999的专栏 1255

详解Nacos集群搭建

在我们日常的开发当中,用的都是单点Nacos,这种模式,我们自己开发测试玩一玩还可以,但是到了企业的生产环境之下,你还这么玩的话,那肯定是要出大问题了。因为在企业当中,我们更加强调的是高可用,所以在企业的生产环境下,Nacos一定要做成个集群。

博客 1万+

二、基于C语言的JPEG解码代码详解

// JPEG解码 // 输入JPEG后输出Bitmap #include <stdio.h> #include <stdlib.h> #pragma warning(disable : 4996) unsigned int BuffIndex; // JPEG数据的位置 unsigned int BuffSize; // JPEG数据的大小 unsigned int BuffX; // 图像的横向尺寸 unsigned int BuffY; //

m0_37633745的博客 4453

Glide DiskCache 原理分析

Glide DiskCache 原理分析1.感性认识DiskCacheDiskCache默认设置:a.内部存储位置 内部存储位置: /data/{package}/cache/image_manager_disk_cache/ public interface DiskCache { /** * An interface for lazily creating a disk cache.

Android开源技术交流 2698

涨点神器:基于YOLOv8的SPD-Conv小目标检测实战教程——让低分辨率场景检测精度飙升

从代码修改到场景落地,每一步都围绕“提升检测精度”这个核心目标,而实际数据也证明了这项技术的强悍——它不是实验室里的花拳绣腿,而是能真正解决工业痛点的涨点神器。在实际场景中,比如无人机巡检的低分辨率航拍图中,对电线、小设备的检测,YOLOv8-SPD的漏检率降低了70%以上。落地时,只需将训练好的YOLOv8-SPD模型部署到边缘设备或云端,即可享受其在小目标、低分辨率场景下的强大性能。的特征融合模块中,通过插入SPD-Conv,让模型在处理小目标时,既能保留空间细节,又能增强通道维度的特征表达。

m0_71589036的博客 157

Glide的缓存机制原理分析

一、Glide请求图片的流程 当执行 Glide.with(this).load("").into(imageview)的into方法时候,该方法接收一个Target或者一个ImageView,Target是一个接口,默认的实现类包括SimpleTarget,ViewTarget,ImageViewTarget等,如果传递的是ImageView接下来回执行以下几步: 调用RequestBuil...

一杯清泉 3960

独创改进 | RT-DETR 引入 Asymptotic Hybrid Encoder | 渐进混合特征解码结构

独创改进🚀! | RT-DETR 引入 Asymptotic Hybrid Encoder | 渐进混合特征解码结构

Coding... 2211

MC_SetOverride指令详细应用介绍(基恩士PLC)

基恩士KV系列PLC和松下总线绝对值伺服运动控制(详细配置+轴控完整ST源代码)

RXXW_Dor的博客 334

Android Glide 框架线程管理模块原理的源码级别深入分析

线程池的创建和管理:Glide 使用多个线程池来处理不同类型的任务,如网络请求、磁盘缓存读写、图片解码等。通过合理配置线程池的参数,可以提高任务的执行效率。任务的调度和执行:根据任务的类型和优先级,将任务分配到合适的线程池中执行。同时,处理任务的排队和并发控制,确保系统资源的合理利用。线程间的通信和同步:在不同线程之间传递数据和状态信息,保证各个模块之间的协作和数据的一致性。例如,在图片加载完成后,将结果从子线程传递到主线程进行显示。Glide 的线程管理模块是其高效运行的关键之一。

Android开发领域创作者 1509

内模控制(IMC)——理论、应用与实践

内模控制方法的核心思想是利用被控对象的数学模型(即内模)构建控制器,使得控制器可以“预知”被控系统的动态响应,从而在控制输入中提前补偿模型的固有特性和扰动影响。常见的内模控制结构中,将系统分为无延迟部分和扰动部分,并利用内部模型预测输出值,再通过反馈回路进行误差修正。utuimctufbtutui​mctuf​bt其中,uimctu_imc(t)ui​mct为内模预测得到的预补偿控制量,ufbtu_fb(t)uf​bt。

闲人编程的博客 2632

Glide源码分析以及三级缓存原理

Glide是Android端开源图片加载库,能够帮助我们下载、缓存、展示多种格式图片。也是现在主流图片加载框架之一。源码内部究竟是如何实现的呢?讲解主流程,简略分析。 用法如下: Glide.with(context).load(url).into(imageView); 我这里拆分为三步分析: 一、with(context) 点击源码查看到是多个重载方法activity、fragment、view等等,下面用其中一个方法来展示 @NonNull public static ...

落雨敏 3824

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Glide原理分析(一)

这段时间一直在使用Gide框架进行图片的加载,对于Glide简便的使用感觉很爽,于是对于Glide其中的实现过程起了兴趣,于是就在网上查了关于Glide原理资料,当时就感慨原来有那么多前辈对Glide的分析,看的我是不甚激动啊,本篇及以后对于Glide的相关文章为我个人学习结果,就当是记一个笔记好了。闲话少说,来看看这个Glide到底是何方神圣。 Glide是google内部的一个用于图片加...

nyist_12138的专栏 2103

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Android 图片框架原理——Glide源码分析

目录 前言 一、With() 二、load() 三、into() 1、buildImageViewTarget() 2、关注1:buildRequest 构建 3、关注2:runRequest 执行 总结 补充,Glide缓存机制: 前言 作用Android开发者,相信大家都知道Glide这款优秀的Android图片加载库。它支持拉取、解码、展示,视频快照、图片和G...

csdn_aiyang的博客 5682

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Glide原理之执行流程分析

Glide是一个优秀的图片加载库,它有如下优点: 1. Glide可以监听Activity的生命周期管理,更加合理的管理图片的加载和释放。 2. 加载质量,Picasso默认采用的ARGB-8888, Glide默认采用的是RGB-565,内存占用会减小一半。 3. Glide可以加载Gif图。 4. 缓存策略和加载速度。Picasso缓存的是全尺寸,而Glide的缓存的图片和ImageV...

hesong的专栏 655

Glide原理分析(二)

上一篇中主要展示了glide的一些使用,感觉glide使用起来还是非常简单的,这次是我个人第一次阅读这种开源框架代码,看起来还是有一点吃力,我只要加油了,我相信以后看的多了就会好起来的。为了方便阅读glide的时候有问题代入感,我列出了几个我想知道的问题,这次也主要按照这几个问题来说吧。 1.Glide是怎么做到加载周期跟随Fragment,Activity的周期的。 2.Glide是如何进行

nyist_12138的专栏 2718
上一篇: RecyclerView使用和原理解析
下一篇: gradle脚本中groovy语法讲解
浮空over
博客等级 码龄7年 6粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值