前言:之前在项目中有幸接触到了Glide图片加载器,实现从网络获取图片到本地在展示的需求,在实现功能的同时,也踩了一些坑,在此记录和大家分享一下心得体会吧。

一、 简介

Glide是一个快速高效的Android图片加载库,注重于平滑的滚动。Glide提供了易用的API,高性能、可扩展的图片解码管道(decode pipeline),以及自动的资源池技术。–来自百度
其实图片加载器有很多种,但是Glide功能十分强大,拥有了一款好的图片加载器的所有优点,作者看过《Android开发艺术探索》中介绍的ImageLoader图片加载器,其功能也非常强大,拥有以下的功能:
1. 图片同步加载功能
2. 图片的异步加载功能
3. 图片压缩
4. 内存缓存
5. 磁盘缓存
6. 网络拉起
注意了,Glide除了拥有ImageLoader以上的特点以外,还有一些其没有优点,如下:
图片加载优先级 支持
使用okHttp加载 支持
图片url和缓存key解耦(cdn请求case 支持(重写GlideUrl)
缓存跳过(模板图片更新case) 支持
生命周期 支持
缩略图支持 支持
setTag问题
废话不多说了,直接介绍如何使用。

二、基本使用

1、首先,要在build.gradle文件中引入glide的依赖。

implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'

2、最后,直接使用了,是不是很简单。基本的使用方法如下:

val imageView: ImageView = findViewById(R.id.imageView)
val url = "https://img2.baidu.com/it/u=1059428104"
Glide.with(imageView)
    .asBitmap()
    .load(url)
    .placeholder(R.drawable.img_1)
    .error(R.drawable.ic_launcher_foreground)
    .into(imageView)

以上代码大致意图是:根据网络url地址加载图片到id为imageView的View中显示,加载的图片保存为Bitmap类型,当然还有其他类型比如:

android glide 怎么加载大图 glide加载图片先后顺序_android


在加载图片之前,我们还可以使用placeholder放置占位图,亦可在图片加载失败之后,放在加载失败的提示图片。如果加载成功之后就会走到into方法中,将图片正确的显示到imageView中。

还有很多用于对于图片加载的可选择项:设置是否优先走内存缓存的skipMemoryCache(false)、是否启用磁盘保存策略的diskCacheStrategy(DiskCacheStrategy.NONE)、以及还可以给图片加载添加监听器listener,只需要实现RequestListener即可,就可以对网络信息进行监听:有无网络/有无图片资源等。

android glide 怎么加载大图 glide加载图片先后顺序_android_02


注意这里面的返回值,只要返回true就不会往下执行了,所以如果你想无论加载失败还是成功都要往下执行的话,返回false即可。

还有一点就是在onResourceReady中的resource是加了问号的,此处仅仅只是判断资源是否存在,如果不为空则表明资源存在,此时还没有开始下载资源到本地,而是在into()方法中才能够得到图片资源进而对其进行设置。

android glide 怎么加载大图 glide加载图片先后顺序_图片加载_03


在.into()中,如果你不仅仅想将下载的图片资源显示到指定View中,此刻你还可以实现xxTarget,来定制自己的图片资源处理逻辑。比如继承CustomTarget抽象类来完成。

android glide 怎么加载大图 glide加载图片先后顺序_kotlin_04


这里需要注意两点:在onResourceReady中的resource不在为空,故此在这里的获取到的资源一定不为空了;这里一定要调用onLoadCleared()方法,当需要重绘或者改变其可见性时,一定要释放掉上面onResourceReady的引用,否则会造成内存泄漏甚至直接crash。这一点在官方文档里面其实已经说明了,不过在使用的时候很容易被遗忘。

android glide 怎么加载大图 glide加载图片先后顺序_android_05


最后一点的坑就是:当网络不好时,加载图片不比较慢,如果你等不急了,此时退出加载的Fragment或者Activity时,但是glide是异步加载的,返回时发现当前依附的页面已经被销毁了,这个时候极容易发生崩溃!!!,所以要在加载图片前判断 页面是否被销毁了。(context.isFinishing || context.isDestroyed)

三、总结

以上就是项目中使用到的Glide,希望大家在使用时,避免以上的坑