文章推荐

我认为对我启发最大的文章是​​这一篇​​​,这篇主要是讲思想。然后源码上对我启发最大的是​​这一篇​​​,这是​​更详细的源码介绍​​​。除了Glide的现成方案之外,还要学习没有第三方框架的时候,​​Bitmap的优化方案​

总体逻辑

1.首先谈设计思想
①缓存:它的四级缓存思路,为什么要有内存缓存,为什么内存缓存是两级,为什么要有磁盘缓存,为什么磁盘缓存是两级。
②加载:参考Bitmap的优化思路,除了Bitmap的:合理分配​​​drawable​​​、​​inSampleSize​​​、图片格式优化之外,还添加了Bitmap缓存池,方便复用。
③除此之外,还能灵活管理生命周期,在页面生命周期结束的时候停止加载(当然前提是传入的​​​Context​​​是​​Activity​​​)。
④当遇到大图加载的时候,Glide只是负责将图片下载下来,图片的加载由自定义的​​​ImageView​​​来实现。(​​BitmapRegionDecoder​​​,线上的:​​SubsamplingScaleImageView​​​)
2.然后谈具体源码实现
①with:得到​​​RequestManager​​​,由空Fragment感知生命周期来调用RequestManager相应方法
②load:构建​​​RequestBuilder​​​ ③into:创建​​Request​​、开启​​Engine​​、运行​​DecodeJob​​线程、​​HttpUrlFetcher​​加载网络数据、回调给载体​​Target​​、载体为​​ImageView​​设置展示图片。
3.谈它的设计模式
①单例模式,with传入上下文构建​​RequestManager​​ ①建造者模式,比如​​RequestBuilder​​ ③工厂模式,创建​​RequestManager​​的时候,如果​​RequestManager​​为空,则通过抽象工厂来创建RequestManger
4.最后谈一些小点
①图片加载是异步线程,通过​​handler​​去更新的ui
②Glide会用到线程池

public final class GlideBuilder {
...
private GlideExecutor sourceExecutor; //加载源文件的线程池,包括网络加载
private GlideExecutor diskCacheExecutor; //加载硬盘缓存的线程池
...
private GlideExecutor animationExecutor; //动画线程池

③Glide不支持解析webp动图。