文章推荐
我认为对我启发最大的文章是这一篇,这篇主要是讲思想。然后源码上对我启发最大的是这一篇,这是更详细的源码介绍。除了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会用到线程池
③Glide不支持解析webp动图。