关于Glide——一个高效的图片加载和缓存类库

简介: 最近应用经常出现OOM的问题,于是图片加载的方式由原来的ImageLoader变成了Glide。我也是跟着导师慢慢的学习了解,有不对的地方欢迎指正。首先,我发现Glide的一个限制性,也就是Glide只能用于ImageView,这是一个不好的地方,但是除了这个基本上都是好用的。

最近应用经常出现OOM的问题,于是图片加载的方式由原来的ImageLoader变成了Glide。我也是跟着导师慢慢的学习了解,有不对的地方欢迎指正。

首先,我发现Glide的一个限制性,也就是Glide只能用于ImageView,这是一个不好的地方,但是除了这个基本上都是好用的。

Glide加载图片最简单的方式如下:

Glide.with(Activity/Context/Fragment/FragmentActivity).load().into(ImageView实例);

                          

从上面这张图可以看到Glide可以通过with()方法来获得Activity/Fragment作为参数,为什么要用Activity/Fragment,这里就涉及到一个生命周期的问题,不过我更喜欢使用getApplicationContext,这样Glide图片加载的生命周期就与Application保持一致,可以避免当用户进入一个界面,图片还没Glide加载出来时,用户快速退出,可以导致的异常情况。也就是说此时的Glide图片加载不仅仅是与当前所在的Activity/Fragment同在,而是和当前的这个应用同在。当然了,有可能我们是要在适配器中使用Glide,那就没有办法,只能使用Context了。

从上图可以看出,Glide图片加载有很多中获取图片的方式,包括文件获取、资源文件Id获取、Uri等等。

确定了加载的图片,当然是要把图片放进对应的控件里面,也就是调用into()方法,在括号里面放入我们的控件即可。

除了上面这些,Glide的加载中还可能用到下面的方法。

1.第一个方法很让我惊讶的就是Glide能加载Gif动图,在Glide中有asBitmap()和asGif()。很明显前者是要求像图片一样展示,后者则是像Gif动图一样展示,当我们加载的是一个gif动图,并且调用asGif()方法,就能实现动图的展示了。突然好像明白微信聊天的动图是怎么来的了,很有可能就是Glide.with().load().asGif().into()这样一行代码实现的呢!

 

2.Glide有淡入淡出的效果,因为它有

crossFade()

crossFade(intanimationId, int duration)

crossfade(intduration)

这三个方法,其中animationId就是动画对应的Id,duration则是持续的时间。

 

3.在开发的过程中,我遇到一个问题,就是界面出现了类似油状物的部分,后面得知Glide加载时有动画效果,也就是Glide中下面这行代码:

只要调用它的dontAnimate()方法就好了,也就是去除加载前的动画效果。

 

4.开发过安卓的程序员就知道,ImageView有一个ScaleType属性,在Glide加载时我们可以通过fitCenter()和centerCrop方法直接在代码中对ImageView进行设置,至于为什么只有这两个,我也不是很清楚,一般情况下我习惯调用centerCrop,或者直接设置改ImageView的scale属性为“centerCrop”。

 

5.在开发的过程中,我还接触到diskCacheStrategy()方法。很明显,这是关于磁盘缓存的方法,通过一些资料的查询,我得知Glide会为每种大小的ImageView缓存一次。尽管一张图片已经缓存了一次,但是假如你要在另外一个地方再次以不同尺寸显示,需要重新下载,调整成新尺寸的大小,然后将这个尺寸的也缓存起来。

具体说来就是:比如像淘宝的评论列表中通常会有缩略图对应的ImageView,而我们点开会在另外一个界面有一张大图对应的ImageView,虽然这是同一张图片,但因为大小的差异,Glide要下载两次。

因此我们可以通过调用diskCacheStrategy(DiskCacheStrategy.ALL)让Glide既缓存全尺寸又缓存其他尺寸。

除此之外,diskCacheStrategy()方法中还可以放入以下参数:

DiskCacheStrategy.NONE(不做任何磁盘缓存)

DiskCacheStrategy.RESULT(缓存转换后的资源)

DiskCacheStrategy.SOURCE(缓存源资源)

 

6.在Glide中有下面三个方法:

对应的我发现在Glide中可以调用placeholder()方法,其中的参数如下图:

这个方法是用来设置加载前的默认图片以及加载失败时的图片。

 

目录
相关文章
|
1月前
|
存储 缓存 前端开发
【Flutter前端技术开发专栏】Flutter中的图片加载与缓存优化
【4月更文挑战第30天】本文探讨了 Flutter 中如何优化图片加载与缓存,以提升移动应用性能。通过使用图片占位符、压缩裁剪、缓存策略(如`cached_network_image`插件)以及异步加载和预加载图片,可以显著加快加载速度。此外,利用`FadeInImage`、`FutureBuilder`和图片库等工具,能进一步改善用户体验。优化图片处理是提升Flutter应用效率的关键,本文为开发者提供了实用指导。
【Flutter前端技术开发专栏】Flutter中的图片加载与缓存优化
|
存储 缓存 UED
watchOS中进行异步图片加载和缓存的策略
watchOS中进行异步图片加载和缓存的策略
85 0
|
存储 缓存 Java
Android--图片加载处理(内存溢出和三级缓存)
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/78052920 最简单的解决办法...
1171 0
|
缓存 Java Android开发
Android图片加载与缓存开源框架:Android Glide
《Android图片加载与缓存开源框架:Android Glide》 Android Glide是一个开源的图片加载和缓存处理的第三方框架。
868 0
|
存储 缓存 BI
Round缓存管理器RoundCacheManager--ESBasic 可复用的.NET类库(26)
1.缘起:     在增量自动获取器章节的缘起部分,我们曾提到增量缓存,本节我们将深入探讨它以及用于管理增量缓存的管理器。我们还是以增量自动获取器章节提到的例子作为基础,并做更进一步的讨论。       OK,现在让我们开始这有趣的旅程。
784 0
|
存储 缓存 安全
层级结构缓存IHiberarchyCache -- ESBasic 可复用的.NET类库(24)
1.缘起:     从IMultiTree到IAgileMultiTree,一切进展得都不错。但是,还有改进的地方。多叉树的一个优点在于,根据指定的节点能够非常迅速地找到其所有的子节点。但是缺点在于,根据节点值的ID定位到目标节点不够快,因为需要对所有的节点进行遍历操作。
932 0
|
缓存
热缓存 IHotCache --ESBasic 可复用的.NET类库(19)
1.缘起:     假设我们有一个订单系统,现在这个系统要增加一个功能――允许客人查核他认为有问题的订单的详细信息。当客人觉得自己的某个订单不对劲时,他首先会从订单系统查询这个订单的详细信息,然后打电话告诉我们的客服有问题的订单的编号,客服再去查核,如果属实,客服还要进一步上报,如果该订单非常重要,则可能需要更进一步上报复查等。
967 0