在Android设备上,加载网络图片一直是一个头疼的问题,因为Android设备种类繁多(当然最主要的是配置),处理的稍不周到轻则应用卡顿,严重者就会出现OOM的,导致程序挂掉。现如今网络上有很多图片库,如 Universal-Image-Loader,Picasso,Fresco,Glide等等。相信列举出的这几个库大家都不陌生,这也是目前最火的图片库了。由于个人的喜好原因(主要是别人介绍说Glide库比较NB),所以就开始研究学习Glide。
Glide库和Picasso库有极大的相似性,编码风格也几近相同,不过Glide缺有着更为强大的功能。它在缓存处理方面有着很大的优势并且支持加载Gif动画以及本地Video。这个库在谷歌开源库中也有应用。如此好东西,心动不如行动,现在开始我们的学习之旅吧。
使用Glide的第一步是现在我们的builde.gradle
配置gradle文件后,我们就可以使用Glide了。上代码
看着很简单吧,一句话就可以实现图片下载和展示。我们看到Glide使用建造者模式加载图片。
我们看到with()可接受三种参数,这也是Glide的亮点,它能根据传入参数Activity/Fragment的生命周期保持一致,去暂停和执行图片加载,这也节省了不必要的流量浪费。
该方式在源码中已经标记@Deprecated
在上面的处理中,我们之间将加载成功的图片展示到ImageView,这样会不会看起来很突兀?是的,Glide为我们提供了设置占位符,他可以让我们知道图片是否加载成功,等
我们都知道,图片加载是不确定的,加载成功需要的时间也是不确定的,而在加载这段时间,我们可以通过placeholder设置给ImageView一个占位符,图片上可以提示正在加载中之类的,当然可以任何你要的效果,
当然除了加载成功前我们设置了占位符,那么如果加载错误(网络原因及url非法原因等导致图片没有加载成功),我们填充一个图片到ImageView提示用户当前图片加载失败。
此时你可能想如何知道图片加载失败的具体原因呢?Glide为我们提供了listener()方法,接收RequestListener对象
我们看到有两个回调方法,通过onException是图片加载异常回调,onResourceReady是加载成功的回调。我们可以测试不同情况打印的日志
通过日志我们很容易看出异常的原因,因此,我们可以针对不同的操作情形,书写自己的处理给用户反馈。
通过上面的分析,我们实现了占位图填充ImageView,但是我们依然发现其中有些不足,因为图片的转换并没有实现平滑过渡效果,实际新api已经默认实现一个渐入渐出的动画效果,默认是300ms.
crossFade()还可以接收一个int型的参数,用它来指定动画执行的时间,例如我们设置动画执行的时间是2s
既然我们能添加一个渐入渐出的动画效果,那么如果想直接显示图片而没有任何淡入淡出效果,该作何处理,我们可以使用dontAnimate()方法,这是直接显示你的图片,而不是淡入显示到 ImageView。
Glide加载图片大小是自动调整的,他根据ImageView的尺寸自动调整加载的图片大小,并且缓存的时候也是按图片大小缓存,每种尺寸都会保留一份缓存,如果图片不会自动适配到 ImageView,调用 override(horizontalSize, verticalSize) 。这将在图片显示到 ImageView之前重新改变图片大小