Glide笔记

162 阅读2分钟

浅浅的阅读一下Glide,本文打算从各模块角度,记录阅读进度和心得

--未完待续

由于技术博客上有太多Glide分析的文章,大多是流程式阅读源码,导致看完就忘了,所以打算自己写一篇从需求角度的Glide文章

提出需求问题

  • 为什么需要Glide,他起了一个怎样的作用?
  • 没有Glide时,如何实现图片的加载?
  • Glide有哪些功能,解决了那些问题?

以下是ImageView的设置图片的方法,可以看出ImageView没有直接从网络URL加载图片和文件流中加载图片的能力。但是我们在开发过程中,获取url和file路径是简单的,所以需要一个将url和filePath转换为Bitmap或Drawable的公共方法。

  imageView.setImageBitmap(bitmap) //直接设置Bitmap对象
  imageView.setImageDrawable(drawable)   
  // 设置Drawable对象,可通过Resource.getDrawable(R.drawable.x)获取本地的图片
  imageView.setImageURI() //从本地文件中获取专有路径,通过IO读取并加载
  imageView.setImageResource() //从包资源中加载

由于还是会调用到原生的setImage方法,因此可以迅速定位到Glide的终端设置图片的实现:

abstract class ImageViewTarget<Z> extends ViewTarget<ImageView, Z>
    implements Transition.ViewAdapter {
      ...
      public void setDrawable(Drawable drawable) {
        view.setImageDrawable(drawable);
      }
      ...
    }

可以看到基类Target的接口方法分别为:

onLoadStart
onLoadFailed
onLoadClear
onResouceReady
onStart
onStop

这说明ViewTarget是一个具有生命周期的图片加载对象。Target处于onResouceReady状态时,图片开始加载。

以下是Glide的target目录下Target的子类实现。

BaseTarget  
  SimpleTarget  
  ViewTarget  
      ImageViewTarget  //面向ImageView的图片加载Target对象
          BitmapImageViewTarget  
          DrawableImageViewTarget  
          ThumbnailImageViewTarget  
              BitmapThumbnailImageViewTarget  
              DrawableThumbnailImageViewTarget  
CustomTarget  
  AppWidgetTarget  //面向小组件的图片加载Target对象
  DelayTarget (GifFrameLoader 内) 
  NotificationTarget  //面向通知的图片加载Target对象
  PreloadTarget  
CustomViewTarget  //自定义的图片加载Target对象
  ClearTarget (RequestManager 内) 
  SizeViewTarget (ViewPreloadSizeProvider 内) 
FlowTarget 
FutureTarget 
  RequestFutureTarget 
PreloadTarget (ListPreloader 内) //后台预加载的Target对象

以上就是Glide的Target模块的设计模式和实现

问:在对ImageView设置图片的逻辑封装之后,还可以从哪些方面优化呢?

1.缩短加载时间

  • 1.1 图片复用:这次加载完成的页面,图片存储到内存中,刷新后不用重新下载和读取,直接读取内存。
  • 1.2 异步加载:多线程同时加载多个图片,后台预加载图片。
  • 1.3 池化对象:加载大量图片的页面关闭,无效的图片对象加入暂存池,减小下次新对象初始化耗时。

2.缩短占用空间

  • 2.1 内存管理:由于内存是定量的,所以要控制缓存图片的size不超过内存。

  • 2.2 适配尺寸:完整的图片大于布局展示的size时,缓存压缩处理后的图片,减小体积。