Glide笔记

一.基本组件

1.基本使用

以下均基于Glide4.x版本。

1
2
3
4
5
6
7
8
9
//加载图片
Glide.with(getContext())
.load(url)
.apply(options)
.into(imageView);
//取消加载
Glide.with(getContext())
.clear(imageView);

2.RequestOptions

Glide的常用选项

  • 裁剪样式circleCrop、circleCrop等。
  • 加载中占位图placeholder
  • 加载失败图error
1
2
3
4
RequestOptions centerCropOptions = new RequestOptions()
.centerCrop()
.placeholder(R.drawable.img_loading)
.error(R.drawable.img_failed);

3.RequestBuilder

可以理解为一个个的请求。

1
2
3
RequestBuilder builder = Glide.with(getContext())
.load(url)
.apply(options);

当调用RequestBuilder.into(target)时开始加载。这个方法的返回值类型不再是RequestBuilder了。

二、常用操作

1.加载失败回调监听

RequestBuilder.listen(RequestListener)方法监听load成功还是失败。

  • 注意这里不能在监听里对同一个target(imageView)发起加载请求,因为当前请求尚未结束,会抛出异常。
  • 所以无法使用这个监听实现加载失败时加载备用url的需求。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Glide.with(getContext())
.load(url)
.apply(options)
.listener(new RequestListener() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) {
//false:事件继续往下传递
//true:事件不再往下传递
return false;
}
@Override
public boolean onResourceReady(Object resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) {
//false:事件继续往下传递
//true:事件不再往下传递
return false;
}
})
.into(imageView);

2.请求失败后启用备用请求

RequestBuilder.error(RequestBuilder)方法可以在这个request失败后启用备用的request。

1
2
3
4
5
6
7
8
9
10
RequestBuilder builder1 = Glide.with(getContext())
.load(url1)
.apply(options);
RequestBuilder builder2 = Glide.with(getContext())
.load(url2)
.apply(options)
.error(builder1);
builder2.into(imageView);

这段代码意义为当url2加载失败后,会启用builder1这个请求,加载url1。这样我们就可以实现多级url加载了。

以下为多级加载url方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static void loadUrls(String[] urls, RequestOptions options, ImageView imageView) {
if (urls == null || urls.length == 0) {
return;
}
RequestBuilder<Drawable> frontBuilder = Glide.with(getContext()).load(urls[0]).apply(options);
RequestBuilder<Drawable> prevBuilder = frontBuilder;
for (int i = 1; i < urls.length; i++) {
RequestBuilder<Drawable> nextBuilder = Glide.with(getContext()).load(urls[i]).apply(options);
prevBuilder.error(nextBuilder);
prevBuilder = nextBuilder;
}
frontBuilder.into(imageView);
}