浅浅的阅读一下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时,缓存压缩处理后的图片,减小体积。