Glide V4

2018-01-19  本文已影响49人  拙峰朽木

[TOC]

集成

dependencies {
    implementation 'com.github.bumptech.glide:glide:4.5.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.5.0'

}

V4增加了Generated API

@(Android 三方库)GlideModule
public class MyAppGlideModule extends AppGlideModule {
}

自定义一个继承于AppGlideModule的类,并在该类前使用GlideModule注解.然后我们重新build一下项目.就可以使用GlideApp

 GlideApp.with(activity).asBitmap().load(path).override(width,height).fitCenter().into(imageView);

GlideExtension

Glide扩展:使用被注解的静态方法来添加新的选项、修改现有选项、甚至添加额外的类型支持
被 @GlideExtention 注解的类有两种扩展方式:

@GlideOption

用 @GlideOption 注解的静态方法用于扩展 RequestOptions

@GlideExtension
public class MyAppExtension {
    /**
     * Size of mini thumb in pixels.
     */
    private static final int MINI_THUMB_SIZE = 100;

    private MyAppExtension() {
    }

    @GlideOption
    public static void miniThumb(RequestOptions options) {
        options.fitCenter().override(MINI_THUMB_SIZE);
    }
}

需要注意的是里面的构造方法必须是私有的,如果定义为public编译会报错:

Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
> java.lang.IllegalArgumentException: RequestOptionsExtensions must be public, with private constructors and only static methods. Found a non-private constructor

这种类应该有一个私有的、空的构造方法,应为 final 类型,并且仅包含静态方法。被注解的类可以含有静态变量,可以引用其他的类或对象。

编译后在GlideOption中会自动添加扩展的miniThumb方法:

/**
 * Automatically generated from {@link com.bumptech.glide.annotation.GlideExtension} annotated classes.
 *
 * @see RequestOptions
 * @see MyAppExtension
 */
@SuppressWarnings("deprecation")
public final class GlideOptions extends RequestOptions implements Cloneable {
 /**
   * @see MyAppExtension#miniThumb(RequestOptions)
   */
  @NonNull
  @CheckResult
  public GlideOptions miniThumb() {
    if (isAutoCloneEnabled()) {
      return clone().miniThumb();
    }
    MyAppExtension.miniThumb(this);
    return this;
  }
/**
   * @see MyAppExtension#miniThumb(RequestOptions)
   */
  @CheckResult
  public static GlideOptions miniThumbOf() {
    return new GlideOptions().miniThumb();
  }
  }

此时我们就可以直接使用扩展的选项:

  GlideApp.with(this)
                .asBitmap()
                .load("")
                .miniThumb()
                .submit(0, 0);

@GlideType

被 @GlideType 注解的方法允许你添加对新的资源类型的支持,包括指定默认选项。

private static final RequestOptions DECODE_TYPE_GIF =RequestOptions.decodeTypeOf(GifDrawable.class).lock();

@GlideType(GifDrawable.class)
    public static void asMyGif(RequestBuilder<GifDrawable> requestBuilder){
        requestBuilder.transition(new DrawableTransitionOptions()).apply(DECODE_TYPE_GIF);

    }

rebuild一下,然后使用自定义的资源类型了

GlideApp.with(this)
                .asMyGif()
                .load("")
                .miniThumb()
                .submit(0, 0);

此时自动在GlideRequests中添加了asMyGif:

/**
   * @see MyAppExtension#asMyGif(RequestBuilder)
   */
  @NonNull
  @CheckResult
  public GlideRequest<GifDrawable> asMyGif() {
    GlideRequest<GifDrawable> requestBuilder = this.as(GifDrawable.class);
    MyAppExtension.asMyGif(requestBuilder);
    return requestBuilder;
  }

占位符

总共分三种:

前两种用的比较多,第三种不被很多人了解.
后备回调符(Fallback)在请求的url/model为 null 时展示。
glide在传入的图片地址为null时,如果不设置fallback 图会显示error的图,如果连error 图都没设置则显示placeholder图.
默认情况下Glide将 null 作为错误处理,所以可以接受 null 的应用应当显式地设置一个 fallback Drawable 。

String url=null;
        GlideApp.with(this)
                .asDrawable()
                .fallback(new ColorDrawable(Color.RED))
                .placeholder(new ColorDrawable(Color.BLACK))
                .error(new ColorDrawable(Color.BLUE))
                .load(url)
                .into(imageView);

经个人以上代码验证,只有当url为null才会显示红色,及时传入空字符串都默认为error,然后显示绿色.

image.png

缓存设置

Glide在发起网络请求获取图片前,先检测内存和磁盘中是否已存在,如果存在则直接从本地取.glide的检测位置有:

缓存策略分:磁盘缓存和内存缓存两种策略

磁盘缓存策略

V4和V3的磁盘缓存策略有所不通,使用时需要注意
我们通过DiskCacheStrategy来配置缓存策略

image.png
看到上表中共有5种:

不保存数据到磁盘

将未解码数据(即原始数据)直接写入到磁盘

将资源解码后再存入磁盘

下载远程资源时即保存原始数据也保存解码后的数据到磁盘(DATA+RESOURCE),如果加载的是本地资源则只保存解码后的资源到磁盘(RESOURCE)

glide默认策略(V4之前默认是ALL),它会尝试对本地和远程图片使用最佳的策略。
当你加载远程数据(比如,从URL下载)时,AUTOMATIC 策略仅会存储未被你的加载过程修改过(比如,变换,裁剪)的原始数据,因为下载远程数据相比调整磁盘上已经存在的数据要昂贵得多。对于本地数据,AUTOMATIC 策略则会仅存储变换过的缩略图,因为即使你需要再次生成另一个尺寸或类型的图片,取回原始数据也很容易。

清空磁盘缓存

new AsyncTask<Void, Void, Void> {
  @Override
  protected Void doInBackground(Void... params) {
    // This method must be called on a background thread.
    Glide.get(applicationContext).clearDiskCache();
    return null;
  }
}

内存缓存策略

总共就2中情况:使用内存缓存和不使用内存缓存
注意通过skipMemoryCache来设置是否跳过内存缓存

#使用内存缓存

这个是默认情况可以不用设置

GlideApp.with(this)
                .asDrawable()
                .load("")
                .skipMemoryCache(false)
                .into(imageView);

不使用内存缓存:

GlideApp.with(this)
                .asDrawable()
                .load("")
                .skipMemoryCache(true)
                .into(imageView);

注意:对于相同的 URL ,如果你的初始请求没调用 .skipMemoryCache(true) 方法,你后来又调用了 .skipMemoryCache(true) 这个方法,这个资源将会在内存中获取缓存。

onlyRetrieveFromCache(仅从缓存加载图片)

某些情形下,你可能希望只要图片不在缓存中则加载直接失败,此时你个就可以使用onlyRetrieveFromCache:

 GlideApp.with(this)
                .asDrawable()
                .load("")
                .onlyRetrieveFromCache(true)
                .into(imageView);

不缓存图片

GlideApp.with(this)
                .asDrawable()
                .load("")
                .skipMemoryCache(true)
                .diskCacheStrategy(DiskCacheStrategy.NONE)
                .into(imageView);

清空内存缓存

最好异步进行:

Glide.get(context).clearMemory();

参考文档:

Github地址
中文文档
郭霖关于V3的Glide源码解析
Glide与Picasso的对比
Android高效加载大图、多图解决方案,有效避免程序OOM
Android LruCache源码分析

上一篇下一篇

猜你喜欢

热点阅读