Glide梳理

Glide

基本使用

Glide.with(this).load(url).into(imageView);

Glide.with() 传入的实例会决定Glide加载图片的生命周期 ;
load()用于指定待加载的图片资源,可以加载本地图片、应用资源、二进制流、Uri对象等等;
into()方法传入View的实例,让图片显示在这个空间上面。

添加占位图:
Glide.with(this)
    .load(url)
    .placeholder(R.drawable.loading)//
    .into(imageView);

异常占位图:
Glide.with(this)
     .load(url)
     .placeholder(R.drawable.loading)
     .error(R.drawable.error)//
     .diskCacheStrategy(DiskCacheStrategy.NONE)
     .into(imageView);

指定图片格式:
Glide.with(this)
     .load(url)
     .asBitmap()//
     .placeholder(R.drawable.loading)
     .error(R.drawable.error)
     .diskCacheStrategy(DiskCacheStrategy.NONE)
     .into(imageView);

Glide.with(this)
     .load(url)
     .asGif()//
     .placeholder(R.drawable.loading)
     .error(R.drawable.error)
     .diskCacheStrategy(DiskCacheStrategy.NONE)
     .into(imageView);

指定图片大小:设置图片加载成多大尺寸无论ImageView的大小
Glide.with(this)
     .load(url)
     .placeholder(R.drawable.loading)
     .error(R.drawable.error)
     .diskCacheStrategy(DiskCacheStrategy.NONE)
     .override(100, 100)//
     .into(imageView);

禁用内存缓存:
skipMemoryCache(true);//

磁盘缓存相关设置:
diskCacheStrategy(DiskCacheStrategy.NONE) ;//禁用
DiskCacheStrategy.NONE: 表示不缓存任何内容。
DiskCacheStrategy.SOURCE: 表示只缓存原始图片。
DiskCacheStrategy.RESULT: 表示只缓存转换过后的图片(默认选项)。
DiskCacheStrategy.ALL : 表示既缓存原始图片,也缓存转换过后的图片。

使用Glide的好处

  • 基本的处理:图片压缩、缓存机制、内存管理等。
  • 除此之外,Glide对Bitmap的管理是跟随生命周期去发生改变的。其它的框架基本都是用LRU算法,当Activity销毁的时候不会释放之前加载图片占用的内存。而Glide的优势就是当Activity销毁的时候,之前加载的所有图片的内存都释放了。

从源码中看基本流程

  • with()

    Glide会根据我们传入with()方法的参数来确定图片加载的生命周期。如果在Glide.with()方法中传入的是一个Application对象,Glide就不需要做什么特殊的处理,它自动就是和应用程序的生命周期是同步的,如果应用程序关闭的话,Glide的加载也会同时终止;如果传入非Application参数的情况,则会向当前的Activity当中添加一个隐藏的Fragment。

    因为Glide需要知道加载的生命周期,可是Glide并没有办法知道Activity的生命周期,于是Glide就使用了添加隐藏Fragment的这种小技巧,因为Fragment的生命周期和Activity是同步的,如果Activity被销毁了,Fragment是可以监听到的,这样Glide就可以捕获这个事件并停止图片加载了。但也不是无法知道Activity的生命周期,因为看Glide的实现上来看,通过注入一个监听器来观察生命周期的,在Activity中也能实现,而是Glide要在Activity与Fragment中都能使用,Fragemnt作为共性部分才被作为监听生命周期的,同时我觉得Glide也因为如果监听了Activity 势必要新建一个BaseActivity让用户继承,这样代码的侵入性就多了,所以不适合。

    Glide就是通过ReqeustManager监听到Fragment的生命周期,从而根据生命周期管理让Request做出相对应的请求。

    (with方法返回的是一个RequestManager对象)

  • load()

    Glide是支持图片URL字符串、图片本地路径等等加载形式的,因此RequestManager中也有很多个load()方法的重载。DrawableTypeRequest的父类DrawableRequestBuilder当中定义的就是我们常用的一些方法比如placeholder()、error()、diskCacheStrategy()、override()等等,以及into()方法。

    (load方法返回一个DrawableTypeRequest对象)

  • into()

    内部调用的buildRequest方法用来构造用来发出加载图片请求的Request对象的,而它调用的buildRequestRecursive方法主要是处理缩略图,buildRequestRecursive内部继续调用obtainRequest方法,这个方法继续调用GenericRequest的obtain()方法,需要传入非常多的参数,其中很多的参数比如placeholderId、errorPlaceholder、diskCacheStrategy等等是使用Glide常用的方法相关,也就是说load()方法中调用的所有API,其实都是在这里组装到Request对象当中的。这一个步骤是构建Request对象。

    而Request对象的执行是下一个步骤requestTracker.runRequest(request)方法的执行,其中调用request.begin()会处理一些占位的图的加载等,而对于我们目的图片的加载,如果前面使用了override() API为图片指定了一个固定的宽高就会调用onSizeReady()方法;如果没指定的话就会调用target.getSize()方法根据ImageView的layout_width和layout_height值做一系列的计算,来算出图片应该的宽高,当然了在计算完之后,它也会调用onSizeReady()方法。

    (into方法返回的是一个Target对象)

缓存机制

  • 内存缓存
  • 磁盘缓存

相关设计模式

  • 单例模式

    with方法中RequestManagerRetriever 对象的获得。

  • 工厂模式

    使用Build的相关方法进行配置创建对象。

  • 建造者模式

  • 外观模式

  • 策略模式

参考文章

posted @ 2020-04-21 09:22  甜树果子二号  阅读(179)  评论(0编辑  收藏  举报