开始使用

基本用法

多数情况下,使用Glide加载图片非常简单,一行代码足矣:

  1. Glide.with(fragment)
  2. .load(myUrl)
  3. .into(imageView);

取消加载同样很简单:

  1. Glide.with(fragment).clear(imageView);

尽管及时取消不必要的加载是很好的实践,但这并不是必须的操作。实际上,当 [Glide.with()][1] 中传入的 Activity 或 Fragment 实例销毁时,Glide 会自动取消加载并回收资源。

在 Application 模块中的使用

在 Application 模块中,可创建一个添加有 @GlideModule 注解,继承自 AppGlideModule 的类。此类可生成出一个流式 API,内联了多种选项,和集成库中自定义的选项:

  1. package com.example.myapp;
  2. import com.bumptech.glide.annotation.GlideModule;
  3. import com.bumptech.glide.module.AppGlideModule;
  4. @GlideModule
  5. public final class MyAppGlideModule extends AppGlideModule {}

生成的 API 默认名为 GlideApp ,与 [AppGlideModule][6] 的子类包名相同。在 Application 模块中将 Glide.with() 替换为 GlideApp.with(),即可使用该 API 去完成加载工作。

  1. GlideApp.with(fragment)
  2. .load(myUrl)
  3. .placeholder(placeholder)
  4. .fitCenter()
  5. .into(imageView);

可以访问 Glide 的 [generated API][7] 页面来获得更多信息。

定制请求

Glide 提供了许多可应用于单一请求的选项,包括变换、过渡、缓存选项等。

默认选项可以直接应用于请求上:

  1. Glide.with(fragment)
  2. .load(myUrl)
  3. .placeholder(placeholder)
  4. .fitCenter()
  5. .into(imageView);

选项也可以通过 RequestOptions 类来在多个请求之间共享:

  1. RequestOptions sharedOptions =
  2. new RequestOptions()
  3. .placeholder(placeholder)
  4. .fitCenter();
  5. Glide.with(fragment)
  6. .load(myUrl)
  7. .apply(sharedOptions)
  8. .into(imageView1);
  9. Glide.with(fragment)
  10. .load(myUrl)
  11. .apply(sharedOptions)
  12. .into(imageView2);

对于更高级的使用场景,通过使用 Glide 的 [generated API][7],Glide 的 API 还可以被更深度地定制以包含自定义的选项。

在 ListView 和 RecyclerView 中的使用

在 ListView 或 RecyclerView 中加载图片的代码和在单独的 View 中加载完全一样。Glide 已经自动处理了 View 的复用和请求的取消:

  1. @Override
  2. public void onBindViewHolder(ViewHolder holder, int position) {
  3. String url = urls.get(position);
  4. Glide.with(fragment)
  5. .load(url)
  6. .into(holder.imageView);
  7. }

对 url 进行 null 检验并不是必须的,如果 url 为 null,Glide 会清空 View 的内容,或者显示 [placeholder Drawable][2] 或 [fallback Drawable][3] 的内容。

Glide 唯一的要求是,对于任何可复用的 View 或 [Target][5] ,如果它们在之前的位置上,用 Glide 进行过加载操作,那么在新的位置上要去执行一个新的加载操作,或调用 [clear()][4] API 停止 Glide 的工作。

  1. @Override
  2. public void onBindViewHolder(ViewHolder holder, int position) {
  3. if (isImagePosition(position)) {
  4. String url = urls.get(position);
  5. Glide.with(fragment)
  6. .load(url)
  7. .into(holder.imageView);
  8. } else {
  9. Glide.with(fragment).clear(holder.imageView);
  10. holder.imageView.setImageDrawable(specialDrawable);
  11. }
  12. }

View 调用 [clear()][4] 或 into(View),表明在此之前的加载操作会被取消,并且在方法调用完成后,Glide 不会改变 view 的内容。如果你忘记调用 [clear()][4],而又没有开启新的加载操作,那么就会出现这种情况,你已经为一个 view 设置好了一个 Drawable,但该 view 在之前的位置上使用 Glide 进行过加载图片的操作,Glide 加载完毕后可能会将这个 view 改回成原来的内容。

这里的代码以 RecyclerView 的使用为例,但规则同样适用于 ListView。

非 View 目标

除了将 BitmapDrawable 加载到 View 之外,你也可以开始异步加载到你的自定义 Target 中:

  1. Glide.with(context
  2. .load(url)
  3. .into(new CustomTarget<Drawable>() {
  4. @Override
  5. public void onResourceReady(Drawable resource, Transition<Drawable> transition) {
  6. // Do something with the Drawable here.
  7. }
  8. @Override
  9. public void onLoadCleared(@Nullable Drawable placeholder) {
  10. // Remove the Drawable provided in onResourceReady from any Views and ensure
  11. // no references to it remain.
  12. }
  13. });

使用自定义 Target 有一些陷阱,所以请务必阅读 [目标文档页][9] 的详细内容。

后台线程

在后台线程加载图片也是直接使用 [submit(int, int)][8]:

  1. FutureTarget<Bitmap> futureTarget =
  2. Glide.with(context)
  3. .asBitmap()
  4. .load(url)
  5. .submit(width, height);
  6. Bitmap bitmap = futureTarget.get();
  7. // Do something with the Bitmap and then when you're done with it:
  8. Glide.with(context).clear(futureTarget);

如果你不想让 BitmapDrawable 自身在后台线程中,你也可以使用和前台线程一样的方式来开始异步加载:

  1. Glide.with(context)
  2. .asBitmap()
  3. .load(url)
  4. .into(new Target<Bitmap>() {
  5. ...
  6. });