【Glide】- 总结

作者: 拔萝卜占坑 | 来源:发表于2020-03-19 20:00 被阅读0次

    简介

    上一篇文章【Glide】- 源码分析讲解了Glide大体执行流程,这篇文章主要讲解Glide的使用,并对开发中应该注重的的知识点进行说明。

    如果对Glide源码感兴趣的,可以查看我的上一篇文章,当然如果觉得我写得比较模糊,可以去阅读郭霖的Android图片加载框架最全解析(一),Glide的基本用法,一共有八篇文章。

    用法

    • 获取Glide实例
      Glide.get(this)
      
    • 简单的图片加载
      Glide.with(this)
            .load(URL)
            .into(imageView);
      

    配置

    设置配置的方法都需要在with方法之后调用。

    基本Glide加载图片的配置选项可以调用apply()方法传入一个BaseRequestOptions类型实例,这样就可以将我们自己的配置运行到Glide中。

    apply(new RequestOptions().placeholder(R.mipmap.place))
    

    上面是添加占位图,接下来的配置,基本上都可以用这种方法实现,所以在下面的讲解中,将不对这种方式进行讲解。点开源码,这种方式就是将配置对象中的参数一一赋值给原配置实例对象,和下面的直接调用单个方法配置作用相同。

    占位图

    placeholder(R.mipmap.place)
    

    方法接受两种参数:图片资源id和Drawable实例。在执行into()方法后,在图片加载任务执行之前会先加载占位图资源。获取占位图可以查看SingleRequest中的getPlaceholderDrawable方法。

     private Drawable getPlaceholderDrawable() {
       if (placeholderDrawable == null) {
         placeholderDrawable = requestOptions.getPlaceholderDrawable();
         if (placeholderDrawable == null && requestOptions.getPlaceholderId() > 0) {
           placeholderDrawable = loadDrawable(requestOptions.getPlaceholderId());
         }
       }
       return placeholderDrawable;
     }
    

    那如果图片加载失败了,显示加载失败占位图

    fallback(R.mipmap.place)
    error(R.mipmap.error)
    

    上面两个方法区别,可以源码中查看注释,下面看一下取用顺序。

    看一下源码中设置加载失败是怎样设置占位图的,顺序是fallback,error,placeholder传入的图片资源。

       private void setErrorPlaceholder() {
          ...
          Drawable error = null;
          if (model == null) {
            error = getFallbackDrawable();
          }
          if (error == null) {
            error = getErrorDrawable();
          }
          if (error == null) {
            error = getPlaceholderDrawable();
          }
          target.onLoadFailed(error);
        }
    

    监听

    listener()
    addListener()
    

    接收RequestListener类型参数,需要实现onLoadFailed和onResourceReady,这两个方法分别在图片加载任务失败和图片资源加载完成的情况下调用,通知客户端。

    load

    load方法接受很多中类型的参数,具体的可以自己查看源码,那么不同的参数在执行流程上有什么不同呢?

    不同的参数类型,会创建不同的ModelLoader类型实例去加载数据,看一下ModelLoader的继承类。


    截屏2020-03-19下午1.13.46.png

    缩略图

    thumbnail(0.5f)
    

    显示的大小将乘以这个洗漱

    thumbnail(Glide.with(this).load(THUM))
    

    当缩略图地址和原图地址不同时,可以传入RequestBuilder实例。如果缩略图先请求回来,者显示缩略图,当原图请求达到时,在显示原图,如果缩略图晚于原图,也不会替换原图,而是被抛弃,忽略。

    缩放模式

    centerCrop(),fitCenter(),centerInside(),circleCrop()几种,至于具体的效果,可以查看文档,或者自己实战看一下效果。如果想显示原图片大小可以调用.override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)。

    资源类型

    在with()之后,load之前调用

    • gif
      asGif()
    • Drawable
      asDrawable()
    • Bitmap
      asBitmap()

    submit

    当调用submit()方法后会立即返回一个FutureTarget对象,然后Glide会在后台开始下载图片文件,调用FutureTarget的get()方法获取下载好的图片资源,如果此时图片还没有下载完,get()方法就会阻塞住,一直等到图片下载完成才会有值返回。

    public void downloadImage() {
        new Thread(() -> {
            try {
                 FutureTarget<Bitmap> target = Glide.with(GlideTestActivity.this)
                        .asBitmap()
                        .load(URL)
                        .submit();
                final Bitmap imageBitmap = target.get();
                    runOnUiThread(() -> imageView.setImageBitmap(imageBitmap));
            } catch (Exception e) {
                    e.printStackTrace();
           }
       }).start();
    }
    

    缓存

    Glide实现了内存缓存和硬盘缓存两种,前一种可以重复将图片数据读取到内存当中,后一种防止应用重复从网络拉取数据。更多可以参考Android图片加载框架最全解析(三),深入探究Glide的缓存机制,但是这篇文章使用的Glide版本和现在最新的,代码上有一些差别。

    看一些最新版怎么构造key的

    EngineKey key =
        keyFactory.buildKey(
                model,
                signature,
                width,
                height,
                transformations,
                resourceClass,
                transcodeClass,
                options);
    

    是直接将model(就是load传入的参数)传入,然后返回一个EngineKey对象,自己可以看一下EngineKey怎么判断两个key相等的。

    在文章提到的关于图片链接token,而token又可能改变情况下解决办法,load传入GlideUrl对象,load(new CustomGlideUrl(URL))。

        public class CustomGlideUrl extends GlideUrl {
    
            private String mUrl;
    
            public CustomGlideUrl(String url) {
                super(url);
                mUrl = url;
            }
            
            @Override
            public String getCacheKey() {
                return mUrl.replace(findTokenParam(), "");
            }
    
            private String findTokenParam() {
                String tokenParam = "";
                int tokenKeyIndex = mUrl.contains("?token=") ? mUrl.indexOf("?token=") : mUrl.indexOf("&token=");
                if (tokenKeyIndex != -1) {
                    int nextAndIndex = mUrl.indexOf("&", tokenKeyIndex + 1);
                    if (nextAndIndex != -1) {
                        tokenParam = mUrl.substring(tokenKeyIndex + 1, nextAndIndex + 1);
                    } else {
                        tokenParam = mUrl.substring(tokenKeyIndex);
                    }
                }
                return tokenParam;
            }
    
        }
    

    在Glide.java中,有这样一段初始化代码:


    截屏2020-03-19下午7.27.08.png

    append的第一个参数就是load传入参数的类型,第二个是数据流类型,第三个是数据加载器实例。

    比如上面我们传入GlideUrl类型,那么Glide将会用HttpGlideUrlLoader来加载数据。

    into

    into(simpleTarget)

    SimpleTarget<Drawable> simpleTarget = new SimpleTarget<Drawable>() {
        @Override
        public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
    
        }
    };
    

    更多用法可以查看Target的继承类,或者可以自己定义类。

    preload

    Glide.with(this)
         .load(url)
         .diskCacheStrategy(DiskCacheStrategy.SOURCE)
         .preload();
    

    使用预加载数据

    Glide.with(this)
         .load(url)
         .diskCacheStrategy(DiskCacheStrategy.SOURCE)
         .into(imageView);
    

    其它

    • 禁止硬件加速
      disallowHardwareConfig()
    • 采样方式
      downsample(DownsampleStrategy.NONE
    • 禁止gif动画
      dontAnimate(),默认false,如设置true,gif将不会显示。
    • 质量压缩
      encodeQuality(@IntRange(from = 0, to = 100) int quality)
    • 格式压缩
      encodeFormat(@NonNull Bitmap.CompressFormat format)
    • 解析图片模式
      format(@NonNull DecodeFormat format)
    • 跳过内存缓存
      skipMemoryCache(boolean skip)
    • 预加载资源到缓存
      preload()
    • 添加额外的因子影响构建缓存key
      当希望glide缓存key加入额外的因子,可以调用signature(@NonNull Key signature)

    参考

    更多高级用法,可以阅读下面文章
    Android图片加载框架最全解析(五),Glide强大的图片变换功能
    Android图片加载框架最全解析(七),实现带进度的Glide图片加载功能
    Android图片加载框架最全解析(六),探究Glide的自定义模块功能

    相关文章

      网友评论

        本文标题:【Glide】- 总结

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