前几篇传送门:
原文传送门:
正文:
在了解完图片的加载、显示、处理之后,接下来继续研究优化。成功、高效加载图片的基本特性之一就是利用缓存。在本文,我们将会了解Glide的缓存机制的基础部分。
在设计一款Android应用的时候,一个好用的图片加载框架应该尝试最小化网路请求的次数。Glide也一样,Glide默认通过内存和磁盘缓存来避免不必要的网络请求。在后续的文章中我们会具体看看其实现细节。如果你已经迫不及待,随时可以查看这个 官方文档 :
对于现在,重要的是,所有的图片请求都会在内存和磁盘上建立缓存。缓存通常都是非常有用的,然而在某些情况下又不希望它这么做。在下一节,我们将学习如何在一次请求中改变Glide的缓存策略。
如果你使用过Glide,你注意到根本不需要为开启缓存做额外的事,它自然而然就实现了。然而,如果你知道某张图片改变非常快,那么你应该要避免某些缓存。
Glide提供了一些方法来调整内存和磁盘缓存策略,让我们先来看看内存缓存。
我们假设一种非常简单的情形:从网络上加载一张图片到ImageView上:
你已经注意到我们这里使用 .skipMemoryCache( true ) 来特地告诉Glide,让它跳过内存缓存。这意味着Glide不会将它放入到内存缓存当中。需要注意的是,这只是影响了内存缓存,Glide依然会使用磁告闷盘缓存来避免额外的网络请求。
很容易理解的是,Glide是默认将所有的图片资源都加入到内存缓存中的。因此,没有必要专门去调用 .skipMemoryCache( false ) 这个方法。
提示:要注意的是,对于同一个图片链接,如果你初次请求的时候没有调用 .skipMemoryCache( true ) ,后面又调用了这个方法,那么它会被加入到内存缓存当中。当你想调整缓存策略的时候,确保你在请求同一个图片的时候保持策略统一。
基于你已经学习完上面的章节衡弊,你知道即使让 内存缓存 失效,图片请求依然会将图片存储在设备的磁盘上。如果你有一张图片,它指向同一个链接上,但是它改变得很快,那么你可能也不想让它存储在磁盘上。
你可以通过 .diskCacheStrategy() 方法改变Glide的 磁盘缓存策略 。与 .skipMemoryCache() 不同的是,它需要传入不同的枚举值,而不仅仅是布尔值。如果你想让磁盘缓存 失效 ,将 DiskCacheStrategy.NONE 作为参入传入即可:
这样的话,这张图片的一点磁盘缓存都不会有。然而,它默认会使用 内存缓存 。为了让两个缓存都失效,把它俩组合一下就好:
我们前面已经提到了,对于磁盘缓存,Glide不止一个选项。在知道有哪些选项之前,你要明白磁盘缓存是相当复杂的东西。例如,Picasso只是缓存完整图片。然而,Glide的缓存不仅缓存原图、完整的图片还有额外一些缩小的图片。
例如,如果你请求一张图片是1000 x 1000像素,然后你的ImageView是500 x 500像素,那么Glide会将这两个尺寸图片都缓存起来。
现在你应该明白磁盘缓存策略 diskCacheStrategy() 中,不同的枚举参数之间的区别了:
作为最后一个例子,如果你有一张图片,你知道会经常修改它并且会有各种不同的版本,那么把它指定为仅缓存原图是很有意义的。因此,我们可以使用 DiskCacheStrategy.SOURCE 来告诉Glide仅缓存原图即可:
由于Glide对于同一张图片可以采取不一样的的缓存方式,想要简单的清除某张图片的缓存不是一件容易的事。你需要找到这张图片所有的变体,然后针对性地让那个缓存失效。
这是一个相当繁琐的步骤, 官方文档 里讲解得非常清楚袜拦弯。
在本文,你学习了Glide缓存图片的基础知识,并且知道如何调整缓存策略。基于你的需求,在后续的博文里,我们将回到这个话题讲解更多高级的优化。然而,这篇文章已经提供了非常有效的方法让你可以好好地利用Glide的缓存了。
下周,我们将看看 良好的用户体验的另一个关键点:优先图片请求!
Glide四级缓存:
先找内存衫闷,再找文件
1)活动缓存(活动资源):ActiveResource,里边使用一个弱引用weakHashMap来保存正在使用的图片,当我们加载图片的时候,先从activeResource里边去查找,如果找不到的话就从内存缓存里查找。理论上没有大小限制,但是因为是弱引用管理的,所以是可回收的。 存活于内存当中,非持久化或改弯
2)内存缓存:默认使用的是LRU的memoryCache,如果没有找到,将从文件缓存中查找。 存活于内存当中,非持久化。
3)文件缓存:先从资源类型文件里查找(经过了圆角缩放处理的),然后从数据来源文件(未经过处理)里查找, 存活于磁盘中,持久化
这种框架的基本思路:源码的歼袜三条主线
(1)请求是怎样发送的?
(2)请求是怎样处理的?
(3)请求是怎样维护的?
Glide.with(context) ---->构建一个RequestManager
.load() ------------->输入数据模型,创建一个RequestBuilder,建造者模式
.into()------->调用RequestBuilder的load方法,buildRequest方法,传入target,
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)