Glide 这样用,更省内存!!!

本文介绍了如何在使用Google官方推荐的图片加载库Glide时,进行内存优化,包括配置TrimMemory和LowMemory回调、使用GlideModule进行内存配置、避免使用额外的图片处理控件和根据内存状况裁剪图片。作者提供了具体的代码示例和内存管理技巧。
摘要由CSDN通过智能技术生成

Glide 是 Google 官方推荐的一款图片加载库,使用起来也非常的简单便利,Glide 它帮我们完成了很多很重要,但是却通用的功能,例如:图片的加载压缩、展示、加载图片的内存管理等等。

对 Glide 还不熟悉的朋友,可以参考 《一篇好文,助你上手 Glide

但是,在使用 Glide 的时候,有一些小技巧,可以让你的内存更优化,避免可能出现的 OOM。例如:虽然 Glide 会根据加载的控件大小,优化加载后的图片尺寸,可如果加载的是一张全屏的大图,依然会是一个占用内存空间非常大的操作。

具体一张 Bitmap 到底占用了多少内存空间,可以参考《Bitmap 比你想的更费内存 | 吊打 OOM

本文有些建议来自 Android TV App,而 Android TV 众多的智能电视和智能盒子,实际上硬件条件非常的恶劣,而 Android TV 的 App ,为了美化,会用到大部分的图片,所以在图片使用方面,OOM 的问题就会被放大,而下面介绍的一些优化方案,在 Android 手机硬件条件非常好的环境下,不使用影响也不大。

二、开始优化

2.1 配置好 TrimMemory 和 LowMemory

Glide 帮我们做了大部分内存管理方面的事情,实际上它还支持做的更好。

对于一个 App 而言,在系统内存环境不足的情况下,会回调一些 onTrimMemory() 或者 onLowMemory() 等方法,这些都是在提醒开发者,当前设备的内存环境已经发生了变化,你最好调整你的内存使用策略,避免被系统清理掉或者出现 OOM 。

关于 onTrimMemroy() 相关内容,不了解的可以先参考《Android 开发,跳不过的内存管理

而 Glide 也为我们提供了类似方法的接口,开发者只需要调用即可,它在内部会随着不同的内存情况,帮我们对缓存的图片进行优化。

在这里,你主要用到 Glide 的 trimMemory()cleanMemroy() 方法,它们一个用来裁剪 Glide 缓存的图片内存空间,一个用来清理 Glide 缓存的内存空间。

在使用 onTrimMemory() 之前,一般是实现 ComponentCallbacks2 接口,然后在 Application 中,通过 registerComponentCallbacks() 方法进行注册。当然,如果你嫌麻烦,还可以直接在 Application 中,重写对应的方法。

了解了这些,就可以根据我们的需要来配置在何时调用 Glide 的对应方法,我推荐的配置:

  1. 在 lowMemory 的时候,调用 Glide.cleanMemroy() 清理掉所有的内存缓存。
  2. 在 App 被置换到后台的时候,调用 Glide.cleanMemroy() 清理掉所有的内存缓存。
  3. 在其它情况的 onTrimMemroy() 回调中,直接调用 Glide.trimMemory() 方法来交给 Glide 处理内存情况。

那么对应的代码,如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

/gm-app.png

既然知道需要调用 Glide 的这两个方法,我们还是需要了解到它内部到底帮我们做了什么。先来看看 Glide 对应的源码。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

/gm-trim.png

在 Glide 的这些方法内,可以看到,它们都会去操作 memoryCachebitmapPool 这两个对象,实际上它们是两个接口,这里如果做特殊处理,操作的都是 Glide 对它们的默认实现,LruResourceCacheLruBitmapPool 。从名称上可以看出来,它们都是遵循 Lru 算法的。

就 Glide 而言,Memory Cache 是 Glide 用来在内存中缓存图片资源,使其在需要使用的时候立刻就可以使用,而不必执行磁盘的 I/O 操作,而 BitmatPool 则是 Glide 维护了一个图片复用池,LruBitmapPool 使用 Lru 算法保留最近使用的尺寸的 Bitmap,这不是本文的重点,大家了解一下即可。

其实 LruResourceCache 和 LruBitmapPool 中,对 clearMemory()trimMemory() 的操作是类似的,这里就以 LruBitmapPool 举例。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

/gm-LruBitmapPool.png

在 LruBitmapPool 中,会根据回调的方法以及参数,调用 clearMemory() 或者 trimToSize(),其实最终都是调用的 trimToSize() 方法。它用于裁剪当前缓存资源的个数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

/gm-trimtosize.png

可以看到,根据裁剪的目标尺寸,会去回收多余的 Bitmap 到合适的目标大小,以达到清理内存的目的。

2.2 配置 GlideModule

GlideModule 是 Glide 提供的一个配置接口,它会在第一次使用 Glide 的时候被调用,用于进行 Glide 的一些初始的配置。

具体 GlideModule 的使用,可以参见官方文档:

github.com/bumptech/gl…

GlideModule 是一个接口,需要实现其对应的方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

/gm-module.png

这里我们只需要使用 applyOptions() 这个方法,它用于在 Glide 的默认配置的基础上,追加一些我们需要的配置。

而在这里,我们可以根据当前设备的内存情况,对其进行一个设定,使用 ActivityManager 获取当前设备的内存情况,如果是处于 lowMemory 的时候,将图片的 DecodeFormat 设置为 RGB_565RGB_565 和默认的 ARGB_8888 比,每个像素会少 2 个byte,这样,等于一张同样的图片,加载到内存中会少一半内存的占用(ARGB_8888 每个像素占 4 byte)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

/gm-apply.png

2.3 避免使用圆角的ImageView

在实际项目内,经常会用到一些带圆角的图片,或者直接就是圆形的图片。圆形的图片,多数用于一些用户的头像之类的显示效果。

而在 Android 下,也有大量的类似 XxxImageView 的开源控件,用于操作 Bitmap 以达到一个圆角图片的效果,例如 Github 上比较火的 RoundedImageView

它们大部分的原理,是接收到你传递的 Bitmap ,然后再输出一个与原来 Bitmap 等大的新 Bitmap ,在此基础之上,进行圆角的一些处理,这就导致了,实际上会在内存中,多持有一个 Bitmap ,一下一张图片占用的内存就被加倍了。

所以既然已经选择使用 Glide ,推荐使用 glide-transformations 这个开源库配合使用,glide-transformations 利用 Glide 的 bitmapTransfrom() 接口,实现对加载的 Bitmap 的进行一些变换操作。

glide-transformations 的 Github 地址如下:

github.com/wasabeef/gl…

glide-transformations 提供一系类对加载的图片的变换操作,从形状变换到色彩变换,全部支持,基本上满足大部分开发需要,并且它会复用 Glide 的 BitmapPool ,来达到节约内存的目的。

具体 glide-transformations 的使用,可以查看 Github 上的文档,下面是它的一个效果图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.4 根据内存情况,裁剪你的图片

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

由于题目很多整理答案的工作量太大,所以仅限于提供知识点,详细的很多问题和参考答案我都整理成了 PDF文件

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

zjtnl-1712641051852)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 17
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值