浅析Glide源码执行流程
- with()
1,传入Application类型的参数,和传入非Application类型的参数。
2,传入Application参数的情况,和应用程序的生命周期同步。
3,非Application参数,会向当前的Activity当中添加一个隐藏的Fragment,以同步生命周期。
4,在非主线程当中使用的Glide,那么不管你是传入的Activity还是Fragment,都会被强制当成Application来处理。 - load()
with()方法返回的是一个RequestManager对象,所以load()方法是在RequestManager类当中。
1,主要的工作都是在loadGeneric(),最后返回DrawableTypeRequest对象,传入ModelLoader对象,还有一大堆杂七杂八的东西。
2,DrawableTypeRequest内容最主要的就是它提供了asBitmap()和asGif()这两个方法。
3,DrawableTypeRequest的父类是DrawableRequestBuilder,各种灵活的API在此。
4,DrawableRequestBuilder类中有一个into()方法,也就是说,最终load()方法返回的其实就是一个DrawableTypeRequest对象。 - into()
1,DrawableRequestBuilder的父类是GenericRequestBuilder,into()逻辑在于此。
2,ImageViewTargetFactory 的buildTarget()方法中会根据传入的class参数来构建不同的Target对象,这个class参数其实基本上只有两种情况,使用Glide加载图片的时候调用了asBitmap()方法,会构建出BitmapImageViewTarget对象,否则的话构建的都是GlideDrawableImageViewTarget对象。
3,又将这个对象参数传入到了GenericRequestBuilder另一个接收Target对象的into()方法当中。
4,在这个into()方法里面创建加载图片的request,obtainRequest()传入各种参数placeholderId、errorPlaceholder、diskCacheStrategy,load()方法中调用的所有API,都是在这里组装到Request对象当中。
5,内部实现创建了一个 GenericRequest 然后调用 GenericRequest#begin 方法,
6,begin 方法主要onSizeReady 负责获取图片,target.onLoadStarted(getPlaceholderDrawable()); //加载默认图
7,onSizeReady方法,内部调用 Engine#load 方法,获取 EngineJob //内部拥有线程池, 用以执行EngineRunnable,EngineRunnable 在 EngineJob中执行
8,核心内容就是 EngineRunnable 的 run 方法,resource = decode()获取要加载图片,通过Glide百货提供的工具来完成网络请求转码保存成bitmap 到 drawable 过程。
9,onLoadComplete 处理展示图片,EngineJob#onResourceReady(依次向上回调到GenericRequest#onResourceReady中)