关于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()方法,其中的参数如下图:

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

 

目录
相关文章
|
5月前
|
缓存 编解码 安全
Android经典面试题之Glide的缓存大揭秘
Glide缓存机制包括内存和硬盘缓存。内存缓存使用弱引用的ActiveResources和LRU策略,硬盘缓存利用DiskLruCache。Engine.load方法首先尝试从内存和弱引用池加载,然后从LRU缓存中加载图片,增加引用计数并移出LRU。若缓存未命中,启动新任务或加入现有任务。内存大小根据设备内存动态计算,限制在0.4以下。DiskLruCache使用自定义读写锁,保证并发安全,写操作通过锁池管理,确保高效。
125 0
|
7月前
|
存储 缓存 前端开发
【Flutter前端技术开发专栏】Flutter中的图片加载与缓存优化
【4月更文挑战第30天】本文探讨了 Flutter 中如何优化图片加载与缓存,以提升移动应用性能。通过使用图片占位符、压缩裁剪、缓存策略(如`cached_network_image`插件)以及异步加载和预加载图片,可以显著加快加载速度。此外,利用`FadeInImage`、`FutureBuilder`和图片库等工具,能进一步改善用户体验。优化图片处理是提升Flutter应用效率的关键,本文为开发者提供了实用指导。
623 0
【Flutter前端技术开发专栏】Flutter中的图片加载与缓存优化
|
7月前
|
XML 缓存 Java
Android App开发之利用Glide实现图片的三级缓存Cache讲解及实战(附源码 超详细必看 简单易懂)
Android App开发之利用Glide实现图片的三级缓存Cache讲解及实战(附源码 超详细必看 简单易懂)
324 0
|
存储 缓存 算法
Android Glide 缓存机制及源码
Glide的简单使用 Glide里的缓存 什么是三级缓存? 缓存机制 为何设计出活动缓存 加载流程 Glide源码 加载流程 1.Engine类 2.load方法 3.EngineKey 4.loadFromMemory 5.loadFromActiveResources 6.loadFromCache 7.getEngineResourceFromCache 8.waitForExistingOrStartNewJob 9.DecodeJob 10.DiskCacheProvider 11.DiskCache.Factory LRU是什么 内存缓存的LRU LruCache LruCache
296 0
Android Glide 缓存机制及源码
|
存储 缓存 监控
简单聊聊Glide的内存缓存
glide的内存缓存有两级:LruCache、ActiveResources 其中LruCache老生常谈了,这里就不细说了。 ActiveResources实际上内含一个HashMap,Map中value则是资源的弱引用。 那么这两级是如何工作的?
289 0
|
存储 缓存 UED
watchOS中进行异步图片加载和缓存的策略
watchOS中进行异步图片加载和缓存的策略
107 0
|
缓存 Android开发
Glide缓存配置
Glide依赖 //这里用的是Android Studio3.0 implementation 'com.github.bumptech.glide:glide:4.
1634 0
|
存储 缓存 Java
Android--图片加载处理(内存溢出和三级缓存)
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/78052920 最简单的解决办法...
1213 0
|
缓存 Java Android开发
Android图片加载与缓存开源框架:Android Glide
《Android图片加载与缓存开源框架:Android Glide》 Android Glide是一个开源的图片加载和缓存处理的第三方框架。
889 0
|
2月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
78 6