作家
登录

Glide 这样用,更省内存

作者: 来源: 2017-10-07 13:46:42 阅读 我要评论


 一、媒介

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

同时,我们也须要用到 ComponentCallbacks2 这个接口,前面已经介绍过了,就不再赘述了。

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

然则,在应用 Glide 的时刻,有一些小技能,可以让你的内存更优化,避免可能出现的 OOM。例如:固然 Glide 会根据加载的控件大年夜小,优化加载后的图片尺寸,可如不雅加载的是一张全屏的大年夜图,依然会是一个占用内存空间异常大年夜的操作。

具体一张 Bitmap 到底占用了若干内存空间,可以参考《 Bitmap 比你想的更费内存 | 明日打 OOM 》

本文有些建议来自 Android TV App,而 Android TV 浩瀚的智能电视和智能盒子,实际上硬件前提异常的恶劣,而 Android TV 的 App ,为了美化,会用到大年夜部分的图片,所以在图片应用方面,OOM 的问题就会被放大年夜,而下面介绍的一些优化筹划,在 Android 手机硬件前提异常好的情况下,不应用影响也不大年夜。

二、开端优化

2.1 设备好 TrimMemory 和 LowMemory

对于一个 App 而言,在体系内存情况不足的情况下,会回调一些 onTrimMemory() 或者 onLowMemory() 等办法,这些都是在提示开辟者,当前设备的内存情况已经产生了变更,你最好调剂你的内存应用策略,避免被体系清理掉落或者出现 OOM 。

关于 onTrimMemroy() 相干内容,不懂得的可以先参考《 Android 开辟,跳不过的内存治理 》

glide-transformations 供给一系类对加载的图片的变换操作,大年夜外形变换到色彩变换,全部支撑,根本上知足大年夜部分开辟须要,并且它会复竽暌姑 Glide 的 BitmapPool ,来达到节约内存的目标。

而 Glide 也为我们供给了类似办法的接口,开辟者只须要调用即可,它在内部会跟着不合的内存情况,帮我们对缓存的图片进行优化。

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

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

懂得了这些,就可以根据我们的须要来设备在何时调用 Glide 的对应办法,我推荐的设备:

  1. 在 lowMemory 的时刻,调用 Glide.cleanMemroy() 清理掉落所有的内存缓存。

  2. 在其它情况的 onTrimMemroy() 回调中,直接调用 Glide.trimMemory() 办法来交给 Glide 处理内存情况。

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

那么对应的代码,如下:

既然知道须要调用 Glide 的┞封两个办法,我们照样须要懂得到它内部到底帮我们做了什么。先来看看 Glide 对应的源码。

在 Glide 的┞封些办法内,可以看到,它们都邑去操作 memoryCache 和 bitmapPool 这两个对象,实际上它们是两个接口,这里如不雅做特别处理,操作的都是 Glide 对它们的默认实现, LruResourceCache 和 LruBitmapPool 。大年夜名称上可以看出来,它们都是遵守 Lru 算法的。

就 Glide 而言,Memory Cache 是 Glide 用来在内存中缓存图片资本,使其在须要应用的时刻急速就可以应用,而不必履行磁盘的 I/O 操作,而 BitmatPool 则是 Glide 保护了一个图片复竽暌姑池,LruBitmapPool 应用 Lru 算法保存比来应用的尺寸的 Bitmap,这不是本文的重点,大年夜家懂得一下即可。

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

在 LruBitmapPool 中,会根据回调的办法以及参数,调用 clearMemory() 或者 trimToSize(),扑晡差终都是调用的 trimToSize() 办法。它用于裁剪当前缓存资本的个数。

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

2.2 设备 GlideModule

GlideModule是 Glide 供给的一个设备接口,它会在第一次应用 Glide 的时刻被调用,用于进行 Glide 的一些初始的设备。

具体 GlideModule 的应用,可以拜见官方文档:


  推荐阅读

  苹果收购法国图像识别公司 技术或植入iPhone

今朝还不清跋扈上述被收购的法国公司的技巧,是否应用到了 iPhone X 手机的面部辨认或是动态神情符功能中。腾讯科技讯,在苹不雅 11 月份将上市发售的新款手机 iPhone X 中,计算机视觉辨>>>详细阅读


本文标题:Glide 这样用,更省内存

地址:http://www.17bianji.com/lsqh/37698.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)