前言
最近有几个项目在使用Glide来加载图片,郭神最近也在写Glide的相关博客,所以准备花时间研究下Glide,作为总结和笔记
郭神Glide的简单使用传送门:http://blog.youkuaiyun.com/guolin_blog/article/details/53759439
现状
Android的图片加载框架有很多,从UniversalImageLoader,到后来Google推出的Volley,再到后来的新兴军Glide和Picasso,当然还有Facebook的Fresco。每个框架都有自己的优势和不足,没有最好的,只有合适的,所以需要根据不同的项目来自行选取。
特点
功能强大:能配置占位图、异常占位图、 使用了3级缓存、支持加载gif图片等。
调用简单:一般只需要一行代码就可以完成图片的加载。
使用
1)将库导入到项目,在app/build.gradle文件中增加如下依赖
dependencies {
compile 'com.github.bumptech.glide:glide:3.7.0'//该地址不是github上的地址,而是jcenter仓库上的地址
}
2)在AndroidManifest.xml中声明网络权限
<uses-permissionandroid:name="android.permission.INTERNET" />
3)简单地加载图片
public void simpleLoadImage(Context context, String imageUrl, ImageView imageView) {
Glide.with(context).load(imageUrl).into(imageView);
}
上述流程就是一个最基本的加载网络图片的流程。是不是很简单啊,下面看看Glide的其他用法。
4)占位图,当需要在加载成功之前显示默认图片时,就需要设置占位图了,代码如下,其实就是在load方法和into方法之前增加了placeholder方法,Glide的其他功能也是类似的调用流程。
public void loadWithPlaceHolder(Context context, String imageUrl, Drawable phDrawable, ImageView imageView) {
Glide.with(context)
.load(imageUrl)
.placeholder(phDrawable)
.into(imageView);
}
5)异常占位符,Glide可以设置一张图片,用于加载图片失败时显示。
public void loadWithError(Context context, String imageUrl, int phId, int errorId, ImageView imageView) {
Glide.with(context)
.load(imageUrl)
.placeholder(phId)
.error(errorId)
.into(imageView);
}
6)禁用文件缓存,Glide默认是为我们提供了三级缓存功能,当我们不需要时(加载Gif图片时就需要禁止,否则Glide会对Gif图对每一帧都进行缓存,这样就会导致第一次加载的时间特别长),可以通过如下代码设置Glide不进行文件缓存。
public void loadWithNoDiskCache(Context context, String imageUrl, int phId, ImageView imageView) {
Glide.with(context)
.load(imageUrl)
.placeholder(phId)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
}
7)加载Gif图,Glide默认是支持Gif图的,不需要任何额外配置,要注意的是,需要禁止文件缓存,否则第一次会很慢。
但是如果我们不希望加载Gif图,而只允许加载静态图片,就可以调用asBitmap方法,这时候,就去取Gif图的第一帧用于展示。
private void loadAsBitmap(Context context, String imageUrl, int phId, int errorId, ImageView imageView) {
Glide.with(context)
.load(imageUrl)
.asBitmap()
.placeholder(phId)
.error(errorId)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
}
与之对应,如果我们只想加载Gif图,可以调用asGif方法,这时候,如果加载的是静态图,就会加载失败。
private void loadAsGif(Context context, String imageUrl, int phId, int errorId, ImageView imageView) {
Glide.with(context)
.load(imageUrl)
.asGif()
.placeholder(phId)
.error(errorId)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.into(imageView);
}
8)指定大小,一般来说使用Glide加载图片,不要指定图片大小,Glide会根据ImageView的大小去决定图片的大小。不过Glide也提供了override方法用于指定加载图片的大小。
private void loadWithWH(Context context, String imageUrl, int width, int height, ImageView imageView) {
Glide.with(context)
.load(imageUrl)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.override(width, height)
.into(imageView);
}
9)清理缓存,使用Glide加载图片时,Glide会帮我们进行内存缓存和文件缓存,其中文件缓存使用的DiskLruCache,Glide为此也提供了清理缓存的方法,我们可以使用clearMemory来清理内存缓存(主线程),使用clearDiskCache来清理文件缓存(子线程)。
private void clearCache(final Activity activity) {
if (Thread.currentThread() == Looper.getMainLooper().getThread()) { //主线程
//清理内存,需要在主线程
Glide.get(activity).clearMemory();
new Thread(new Runnable() {
@Override
public void run() {
//清理文件缓存,需要在子线程
Glide.get(activity).clearDiskCache();
}
}).start();
} else { //子线程
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
Glide.get(activity).clearMemory();
}
});
Glide.get(activity).clearDiskCache();
}
}
后续会继续更新该博客Glide的使用
知其然,也要知其所以然,Glide的源码分析传送门:http://blog.youkuaiyun.com/luofen521/article/details/71213440