1. with(this):生命周期绑定
Glide.with(Activity/Fragment/Context)
  • 核心机制:创建与 UI 生命周期绑定的 RequestManager

  • 底层实现

    • 通过 RequestManagerRetriever 获取单例

    • 非 Application 上下文

      • 向 Activity/Fragment 添加隐藏 FragmentRequestManagerFragment

      • 通过 Fragment 生命周期回调控制请求(页面销毁时自动取消加载)

    • Application 上下文:使用全局生命周期

  • 设计意图:解决内存泄漏问题,实现请求与页面生命周期同步


2. load(url):构建数据模型
.load(String url)
  • 核心流程

    1. 创建 DrawableTypeRequest 对象

    2. 初始化 ModelLoader

      • String.class → StreamStringLoader(处理网络流)

      • 最终组合为 ImageVideoModelLoader(支持流 + 文件描述符双通道)

    3. 封装参数:

      • URL 数据源

      • 解码器(ImageVideoGifDrawableLoadProvider

      • 转码器(GifBitmapWrapperDrawableTranscoder

  • 关键设计:通过泛型抽象支持多种数据源(URL/文件/资源ID等)


3. into(imageView):加载与渲染
.into(ImageView)
▶ 阶段1:初始化
  1. 将 ImageView 封装为 TargetGlideDrawableImageViewTarget

  2. 构建 GenericRequest 对象(整合 URL/Target/缓存策略等参数)

▶ 阶段2:缓存检查

▶ 阶段3:网络加载(未命中缓存时)
  1. 网络层

    • 使用 HttpUrlFetcher(基于 HttpURLConnection

    • 支持自动重定向(最大 5 次跳转)

    // 核心下载逻辑
    HttpURLConnection connection = url.openConnection();
    InputStream is = connection.getInputStream();
  2. 解码流程

    • 通过 ImageVideoGifDrawableLoadProvider 选择解码器

    • 静态图

      • StreamBitmapDecoder → Downsampler.decode()(处理尺寸采样/旋转)

      • 最终得到 BitmapResource

    • GIF

      • GifResourceDecoder → 生成 GifDrawable

    • 统一封装为 GifBitmapWrapper

  3. 转码适配

    • GifBitmapWrapperDrawableTranscoder 统一转码为 GlideDrawable

      • 静态图 → GlideBitmapDrawable

      • GIF → GifDrawable

▶ 阶段4:线程切换与渲染
  1. 切主线程

    • 通过 Handler(Looper.getMainLooper()) 切换线程

    // EngineJob 中的线程切换
    MAIN_THREAD_HANDLER.obtainMessage(MSG_COMPLETE, this).sendToTarget();

  2. 渲染到 ImageView

    // GlideDrawableImageViewTarget 最终调用
    imageView.setImageDrawable(glideDrawable);
  3. GIF 处理

    • 调用 GifDrawable.start() 启动动画


关键核心设计

  1. 三级缓存体系

    • 活动资源(Active Resources)→ 内存缓存(LRC)→ 磁盘缓存(DiskLRU)

    • 缓存Key生成规则:URL + 尺寸 + 变换签名

  2. 资源复用优化

    • BitmapPool 复用 Bitmap 内存,减少 GC

    Bitmap reusedBitmap = bitmapPool.get(width, height, config);
  3. 生命周期自动化

    • 通过隐藏 Fragment 实现请求自动取消

  4. 模块化扩展

    • 支持自定义 ModelLoader(扩展数据源)

    • 支持自定义 Transformation(图片变换)

  5. 智能尺寸计算

    • 自动读取 View 的 layout_width/layout_height

    • 通过 ViewTarget.getSize() 计算适配尺寸


面试级回答模板

Glide.with().load().into() 的核心流程:

1. 生命周期绑定(with)

  • 通过隐藏 Fragment 绑定页面生命周期,确保页面销毁时自动释放资源

2. 数据建模(load)

  • 创建 ModelLoader 处理不同类型数据源(URL 对应 StreamStringLoader

  • 封装为可配置的 DrawableTypeRequest

3. 加载渲染(into)

  • 缓存检查:三级缓存依次查询(活动缓存 → 内存 → 磁盘)

  • 网络下载:未命中时通过 HttpUrlFetcher 下载数据流

  • 解码处理:根据图片类型选择解码器(静态图用 Downsampler 处理尺寸采样)

  • 统一转码:转换为 GlideDrawable 兼容静图/GIF

  • 线程切换:通过 Handler 切主线程渲染到 ImageView

  • GIF 处理:自动调用 start() 播放动画

设计优势

  • 三级缓存减少网络请求

  • BitmapPool 复用内存降低 GC 频率

  • 生命周期自动化管理避免内存泄漏

  • 模块化设计支持灵活扩展

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88081.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88081.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/88081.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

#### es相关内容的索引 ####

倒排索引 结构 #### es倒排索引的结构 ####-CSDN博客 向量索引 结构应用 #### es向量检索 的 结构及应用_es 向量 文本检索-CSDN博客 ann算法 ann算法的种类有哪些,之间的区别,各自的适用场景-CSDN博客 地理信息索引 es地理信息索引的类型以及geo_po…

小飞电视:智能电视与移动设备的娱乐新选择

在数字娱乐时代,人们对于影视内容的需求日益增长,不仅追求丰富多样的节目选择,还希望获得便捷、个性化的观看体验。小飞电视正是这样一款专为智能电视和移动设备设计的视频娱乐应用,它凭借海量的影视资源、高清流畅的播放效果以及…

删除node并且重装然后重装vue

参考第一篇文章 node.js卸载与安装超详细教程_node卸载重装-CSDN博客 第二篇文章安装vue Vue安装与配置教程(非常详细)_安装vue-CSDN博客

基于YOLOv10算法的交通信号灯检测与识别

目录 一.🦁 写在前面1.1 实现模块划分1.2 优化与实时性支持 二.🦁 相关技术与理论基础2.1 各版本yolo对比2.2 YOLOv10网络结构 三.🦁 结果分析3.1 训练损失与验证损失分析3.2 精确率(Precision)、召回率(Re…

洪水风险图制作全流程:HEC-RAS 与 ArcGIS 的耦合应用

技术点目录 一、HER-RAS理论二、一维数学模型基本地形导入三、恒定流、非恒定流一维数学模型水流计算四、一维数学模型计算结果分析五、一维数学模型增设构筑物六、二维河道水动力模拟七、HEC-RAS在溃坝模型中的应用八、HEC-RAS在洪水风险图中的应用了解更多 —————————…

视觉大语言模型未能充分利用视觉表征

视觉大语言模型未能充分利用视觉表征 FesianXu 20250612 at Wechat Search Team 前言 这两天看到一篇新挂在arxiv上的文章 [1],讨论了下视觉大语言模型的视觉表征退化问题。先前的研究将VLM缺陷归咎于视觉编码器薄弱,并提出集成编码器方案以弥补不足&am…

SSRF3 任意文件读取

一.任意文件读取 http://192.168.112.12/pikachu-master/vul/ssrf/ssrf_curl.php?urlfile:///etc/passwd 读取文件使用 file://文件路径即可,这里我们换协议为file,然后从根目录开始读取。 /etc/passwd 我们这样修改完url路径后查看结果可以看到文件内…

洛谷P3953 [NOIP 2017 提高组] 逛公园

洛谷P3953 [NOIP 2017 提高组] 逛公园 洛谷题目传送门 题目背景 NOIP2017 D1T3 题目描述 策策同学特别喜欢逛公园。公园可以看成一张 N N N 个点 M M M 条边构成的有向图,且没有 自环和重边。其中 1 1 1 号点是公园的入口, N N N 号点是公园的出…

Vue3+TypeScript+Element Plus 表格展开行优化方案

在 Vue3 TypeScript Element Plus 项目中优化表格展开行的内存使用,主要从 渲染优化、数据管理 和 内存回收 三方面入手。以下是最佳实践和完整解决方案: 1. 懒加载展开内容(核心优化) 只当行展开时才渲染内容,避免…

OpenCV——直方图与匹配

直方图与匹配 一、直方图简介二、直方图统计三、直方图比较四、直方图均衡化五、自适应的直方图均衡化六、直方图反向投影七、模板匹配 一、直方图简介 图像直方图(Histogram)是一种频率分布图,它描述了不同强度值在图像中出现的频率。图像直…

通义大模型在文档自动化处理中的高效部署指南(OCR集成与批量处理优化)

1. 传统OCR解决方案常面临识别精度低、版面分析能力弱、处理效率瓶颈等问题。通义大模型凭借其多模态理解和生成能力,为文档处理领域带来革命性突破。本文将深入探讨如何高效部署通义大模型实现端到端的文档自动化处理,特别聚焦OCR集成与批量处理优化两…

Ubuntu20.04通过ssh协议配置远程终端

一、在目标计算机(即被连接的计算机)上操作: 1、安装 OpenSSH 服务器: sudo apt update sudo apt install openssh-server3、启动并设置 SSH 服务开机自启: sudo systemctl enable --now ssh二、在源计算机&#xf…

《HTTP权威指南》 第7章 缓存

带着问题学习: 缓存如何提高性能如何衡量缓存的有效性缓存置于何处作用最大HTTP如何保持缓存副本的新鲜度缓存如何与其他缓存及服务器通信 web缓存是可以自动保存常见文档副本的HTTP设备。 缓存优点 减少冗余的数据传输,节省网络费用缓解网络瓶颈问题&…

第十三章 模板

函数模板 函数模板使用 函数模板注意事项 自动类型推导,必须推导出一致的数据类型T,才可以使用 模板必须要确定出T的数据类型,才可以使用 普通函数和函数模板的类型转化 普通函数隐式类型转化(char转int) 函数模板正常使用不会发生…

云计算-专有网络VPC

🌐 什么是 VPC?(Virtual Private Cloud) VPC(Virtual Private Cloud,虚拟私有云) 是公有云服务商提供的一种网络隔离服务,允许用户在云中创建一个逻辑隔离的私有网络环境。你可以在这…

关于*gin.Context的理解

关于*gin.Context的理解 作为初学者,在学习go语言用gin开发web时,我对*gin.Context感到困惑。本文章以自我总结为主,大部分为来自询问ai后的总结,如有问题欢迎指出。 *gin.Context可以理解为一个gin框架的上下文对象指针&#x…

Qt中的OpenGL (6)[坐标系统]

文章目录 文章说明学习目标目录结构坐标系统局部空间世界空间观察空间裁剪空间正射投影矩阵透视投影矩阵组合进入3D世界顶点数据着色器设置数据矩阵设置文章说明 本文是学习OpenGL的笔记,主要参考大神JoeyDeVries的LearnOpenGL第八课《坐标系统》,并将教程中的代码基于Qt进行…

Spring Aop @After (后置通知)的使用场景?

核心定义 After 是 Spring AOP 中的另一种通知(Advice)类型,通常被称为“后置通知”或“最终通知”。 它的核心作用是: 无论目标方法是正常执行完成,还是在执行过程中抛出了异常,After 通知中的代码 总是…

UNet改进(4):交叉注意力(Cross Attention)-多模态/多特征交互

在计算机视觉领域,UNet因其优异的性能在图像分割任务中广受欢迎。本文将介绍一种改进的UNet架构——UNetWithCrossAttention,它通过引入交叉注意力机制来增强模型的特征融合能力。 1. 交叉注意力机制 交叉注意力(Cross Attention)是一种让模型能够动态地…

C#里从CSV文件加载BLOB数据字段到数据库的处理

大量的数据保存在CSV文件, 当需要把这些数据加载到数据库,然后使用数据库来共享出去。 就需要把CSV文件导入数据库, 怎么样快速地把CSV文件导入数据库呢? 这个就需要使用类MySqlBulkLoader,它是mariadb数据库快速导入的方式。 一般使用SQL语句导入是10秒,那么使用这种方…