Glide V4

作者: 拙峰朽木 | 来源:发表于2018-01-19 17:20 被阅读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 - 为 RequestOptions 添加一个自定义的选项。
    • GlideType - 添加对新的资源类型的支持(GIF,SVG 等等)。

    @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;
      }
    

    占位符

    总共分三种:

    • placeholder
    • error
    • fallback

    前两种用的比较多,第三种不被很多人了解.
    后备回调符(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的检测位置有:

    • 活动资源 (Active Resources) - 现在是否有另一个 View 正在展示这张图片?
    • 内存缓存 (Memory cache) - 该图片是否最近被加载过并仍存在于内存中?
    • 资源类型(Resource) - 该图片是否之前曾被解码、转换并写入过磁盘缓存?
    • 数据来源 (Data) - 构建这个图片的资源是否之前曾被写入过文件缓存?

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

    磁盘缓存策略

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

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

    不保存数据到磁盘

    • DATA

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

    • RESOURCE

    将资源解码后再存入磁盘

    • ALL

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

    • AUTOMIC

    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源码分析

    相关文章

      网友评论

          本文标题:Glide V4

          本文链接:https://www.haomeiwen.com/subject/wbcaoxtx.html