文章推荐
我认为对我启发最大的文章是这一篇,这篇主要是讲思想。然后源码上对我启发最大的是这一篇,这是更详细的源码介绍。除了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动图。









