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

glide介绍

能力

从网络 URL、本地文件、资源 ID、Vector Drawable 等多种来源加载图

通过在宿主 Activity/Fragment 中注入空白 Fragment(SupportRequestManagerFragment),自动监听生命周期事件(如 onStop/onDestroy),实现请求的暂停、恢复和取消,防止内存泄漏。

内置常用变换如 circleCrop()(圆形裁剪)、roundedCorners(radius)(圆角),也支持自定义变换(如高斯模糊

提供 placeholder() 设置加载中的占位图,error() 处理加载失败的替代图,增强用户体验

封装

基于 OkHttp 实现网络图片加载,用户无需手动处理网络连接。

内置线程池(DecodeJob)和异步任务(EngineJob),自动分配解码和加载线程,避免主线程阻塞。

复用已创建的 Bitmap 对象,减少内存分配和 GC 压力

支持 RGB_565 格式硬解码,内存占用减少 50

缓存策略

活动缓存 active cache(运行时缓存,app杀掉就没有了)

存储正在使用的图片,不使用lru算法,解决如果只用lru内存缓存,短时间缓存大量图片导致正在使用的图片被移除的风险,从而引起程序崩溃

弱引用是由这样一个HashMap维护,key是缓存的key,这个key由图片url、width、height等10来个参数组成;value是图片资源对象的弱引用形式

内存缓存 memory cache (运行时缓存,app杀掉就没有了)

release() 后计数归 0,图片会从活动缓存转移到内存缓存

触发迁移的关键事件,调用 onResourceReleased()

如Item划出屏幕

磁盘缓存 disk

磁盘缓存将图片存储在设备的磁盘上,当内存缓存中没有所需图片时,Glide 会先从磁盘缓存中查找。磁盘缓存可以分为全尺寸缓存和转换后缓存。全尺寸缓存存储的是原始图片,而转换后缓存存储的是经过裁剪、缩放等处

应用场景

  • DiskCacheStrategy.ALL:适用于大多数场景,既能缓存原始图片,又能缓存转换后的图片,保证了图片加载的效率和灵活性。
  • DiskCacheStrategy.DATA:当只需要缓存原始图片,不需要缓存转换后的图片时使用,例如需要对图片进行多次不同的转换操作。
  • DiskCacheStrategy.RESOURCE:如果只关心转换后的图片,不关心原始图片,可以使用该策略,减少磁盘空间的占用。
  • DiskCacheStrategy.NONE:当图片数据敏感,不希望被缓存,或者需要每次都从网络加载最新图片时使用。
  • DiskCacheStrategy.AUTOMATIC:根据图片的来源和处理方式自动选择合适的缓存策略,是一种较为智能的缓存策略。

判断图片是否在使用

EngineResource 是 Glide 对图片资源(如解码后的 Bitmap)的包装类,内部维护一个 int 类型的引用计数器(refCount) acquire():引用计数 +1;release():引用计数 -1

缓存流程与优化

  1. 缓存键生成
    缓存键由 URL、尺寸、变换参数、解码格式等 10 余个参数生成(EngineKey),确保不同版本的图片(如不同尺寸或变换)被正确区分。例如,同一 URL 的 100x100 和 200x200 图片会生成不同键,避免缓存冲突。
  2. 缓存命中顺序
    加载时依次检查:活动资源 → 内存缓存 → 磁盘资源缓存 → 磁盘数据缓存 → 网络。例如,若内存缓存中存在缩放后的图片,直接复用,无需重复解码。
  3. 高级优化
    • 签名机制:对内容变化但 URL 不变的图片(如用户头像),通过 signature() 强制刷新缓存。
    • 预加载与降级:滑动时优先加载缩略图,暂停不可见区域的高分辨率请求,节省流量和 CPU 资源。

典型应用场景

  • 列表滑动优化:使用 diskCacheStrategy(DiskCacheStrategy.RESOURCE) 缓存转换后的缩略图,减少滑动时的解码耗时。
  • 大图片处理:通过 override(300, 200) 强制压缩尺寸,结合 BitmapPool 复用内存,避免 OOM。
  • 动态内容更新:对实时变化的图片(如验证码),调用 skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE) 跳过所有缓存。

文章转载自:

http://5yBfv07a.dcccL.cn
http://YixdxpVy.dcccL.cn
http://LfEMl6b6.dcccL.cn
http://m9GTABOQ.dcccL.cn
http://QSWRdbcc.dcccL.cn
http://L6UALVyJ.dcccL.cn
http://jWOcCSqL.dcccL.cn
http://J9xxqZR5.dcccL.cn
http://pXNcklf3.dcccL.cn
http://XGOYoYWK.dcccL.cn
http://kicON8Ci.dcccL.cn
http://oLSlzoAR.dcccL.cn
http://qB6kNTmY.dcccL.cn
http://hLLGr1n6.dcccL.cn
http://SQ04xMjU.dcccL.cn
http://yCtbefiz.dcccL.cn
http://vEcj9UhV.dcccL.cn
http://uBUiBeVw.dcccL.cn
http://GQXqx0Me.dcccL.cn
http://ytSFIOQR.dcccL.cn
http://mbrCHff3.dcccL.cn
http://fn9bOI72.dcccL.cn
http://NvBgDduS.dcccL.cn
http://13cJuu0e.dcccL.cn
http://JSa2qR3C.dcccL.cn
http://d5PFwgBc.dcccL.cn
http://fqI2NuVk.dcccL.cn
http://HrimHyxn.dcccL.cn
http://6XTKhzIt.dcccL.cn
http://3OHrLHrq.dcccL.cn
http://www.dtcms.com/a/379253.html

相关文章:

  • vscode 中通义灵码显示登录过期
  • 【VScode】ssh报错
  • STM32 norflash W25Q64移植FatFS
  • 【Git】版本控制-Gitee
  • Qt常见问题
  • 泛函Φ(u)驻点的方程与边界条件 / 求给定泛函驻点满足的方程及边界条件
  • 统一权限管理平台登录不了怎么办?
  • 中级统计师-统计法规-第四章 统计管理体制
  • java反射(详细教程)
  • 【Leetcode】高频SQL基础题--1327.查找拥有有效邮箱的用户
  • Redis(集群)
  • 吾爱小工具!一键屏蔽流氓软件!
  • 告别网络监控“盲区”!OpManager全新升级解锁轻量监控新纪元!
  • 实验室试管架 | 塑料、金属等多种材质与规格 | 支持多种试管尺寸 | Sigma-Aldrich
  • .net 类库生成的DLL源码混淆加密
  • 北京-测试-入职金融公司第四周-加班&未发现bug
  • Story2Board: A Training-Free Approach for Expressive Storyboard Generation论文
  • 纯`css`轻松防止滚动穿透
  • 30天Java速成计划:从零基础到能刷算法题!
  • 【点云分类】简述对pointnet和pointnet++的理解
  • 【202509新版】Hexo + GitHub Pages 免费部署个人博客|保姆级教程
  • PigX整合knife4j
  • 安全审计-Ubuntu防火墙ufw
  • 编译器的相关知识(入门时著)
  • 开始 ComfyUI 的 AI 绘图之旅-Flux.1 ControlNet (十)
  • 企业微信内部应用js-sdk使用流程
  • Java Spring Boot常见异常全解析:原因、危害、处理与防范
  • Qt加载百度地图详细流程(附带报错解决方法)
  • 3D渲染时GPU内存不足解决措施
  • MySQL什么操作会加锁?