原文地址:Android图片加载框架最全解析(二),从源码的角度理解Glide的执行流程
学习笔记:
1.如何阅读源码
简单概括就是八个字:抽丝剥茧、点到即止。应该认准一个功能点,然后去分析这个功能点是如何实现的。但只要去追寻主体的实现逻辑即可,千万不要试图去搞懂每一行代码都是什么意思,那样很容易会陷入到思维黑洞当中,而且越陷越深。因为这些庞大的系统都不是由一个人写出来的,每一行代码都想搞明白,就会感觉自己是在盲人摸象,永远也研究不透。
2.开始阅读
a.with()
很简单的一个道理,如果你在某个Activity上正在加载着一张图片,结果图片还没加载出来,Activity就被用户关掉了,那么图片还应该继续加载吗?当然不应该。可是Glide并没有办法知道Activity的生命周期,于是Glide就使用了添加隐藏Fragment的这种小技巧
如果我们是在非主线程当中使用的Glide,那么不管你是传入的Activity还是Fragment,都会被强制当成Application来处理。
with()方法的源码还是比较好理解的。其实就是调用RequestManagerRetriever的with()为了得到一个RequestManager对象而已,然后Glide会根据我们传入with()方法的参数来确定图片加载的生命周期,
b.load()
fromString()
loadGeneric()方法是要返回一个DrawableTypeRequest对象的
public BitmapTypeRequest<ModelType> asBitmap() {
return optionsApplier.apply(new BitmapTypeRequest<ModelType>(this, streamModelLoader,
fileDescriptorModelLoader, optionsApplier));
}
public GifTypeRequest<ModelType> asGif() {
return optionsApplier.apply(new GifTypeRequest<ModelType>(this, streamModelLoader, optionsApplier));
}
DrawableTypeRequest的父类是DrawableRequestBuilder ,DrawableRequestBuilder中有很多个方法,这些方法其实就是Glide绝大多数的API了。
- into()
glide.buildImageViewTarget()
buildRequestRecursive()处理缩略图
requestTracker.runRequest()执行request
begin()