注:这里只是简略的流程,方便快速查找定位,更加具体的细节,只需要遇到问题的时候灵活运用断点定位即可
方法技巧:所有的源码均可以通过找到某个库最基础的使用方法,断点=> 开头和结尾,即可对清晰地看到整个源码的执行流程
想法和思考:不需要阅读网络上别人的源码剖析,我觉得想法和思考性的技巧更加重要,不管对于任何东西,当你遇到越来越多的东西之后,发现最重要的永远是"基本功"
ApplicationManager.getImageLoader().loadImage(imageUrl, imageView, 0);
ApplicationManager只是一个二次封装的管理类,真实加载管理是GlideImageLoaderImpl
com.bumptech.glide.RequestBuilder#into(android.widget.ImageView) {
// 此处均为设置RequestBuilder的一系列参数
RequestBuilder<Drawable> builder = requestManager.load(uri);
builder.apply(requestOptions);
// ...
// 请求触发的地方
builder.into(imageview);
com.bumptech.glide.RequestBuilder#into(Y, com.bumptech.glide.request.RequestListener<TranscodeType>, com.bumptech.glide.request.BaseRequestOptions<?>, java.util.concurrent.Executor) {
// 建立一个Request对象(包含线程池等,Target可以理解为ImageView的wrapper对象})
Request request = buildRequest(target, targetListener, options, callbackExecutor);
// ImageView的wrapper绑定request
target.setRequest(request);
// 发送网络请求
requestManager.track(target, request);
// 网络触发
com.bumptech.glide.request.SingleRequest#begin
com.bumptech.glide.request.SingleRequest#onSizeReady {
engine.load {
com.bumptech.glide.request.SingleRequest#onResourceReady(com.bumptech.glide.load.engine.Resource<?>, com.bumptech.glide.load.DataSource) {
if(targetListener != null) {
targetListener.onResourceReady
} else {
1. 含有自定义回调的 target.onResourceReady =>
com.douyou.libcommon.imageloader.glide.GlideImageLoaderImpl.BitmapTarget#onResourceReady {
// 自定义的回调如:ApplicationManager.getImageLoader().loadImage(imageView.getContext(),imageUrl, new SimpleImageLoadListener(){ ... }
listener.onLoadComplete(uri, null, resource)
}
2. 不含有自定义回调,Glide直接加载的 target.onResourceReady =>
com.bumptech.glide.request.target.ImageViewTarget#onResourceReady {
// Glide内部给ImageView设置资源
com.bumptech.glide.request.target.ImageViewTarget#setResourceInternal
com.bumptech.glide.request.target.DrawableImageViewTarget#setResource
view.setImageDrawable(resource);
}
}
}
}
}
}
}
上述流程 1 2 分叉点的规则见:
com.bumptech.glide.GlideContext#buildImageViewTarget
public class ImageViewTargetFactory {
@NonNull
@SuppressWarnings("unchecked")
public <Z> ViewTarget<ImageView, Z> buildTarget(
@NonNull ImageView view, @NonNull Class<Z> clazz) {
if (Bitmap.class.equals(clazz)) {
return (ViewTarget<ImageView, Z>) new BitmapImageViewTarget(view);
} else if (Drawable.class.isAssignableFrom(clazz)) {
return (ViewTarget<ImageView, Z>) new DrawableImageViewTarget(view);
} else {
throw new IllegalArgumentException(
"Unhandled class: " + clazz + ", try .as*(Class).transcode(ResourceTranscoder)");
}
}
}
网友评论