Glide是android 熟知的加载图片的框架。其用法非常简单,但是内部源码可以说拓展的非常厉害。我们先从源码角度一步一步来分析吧。
基础用法: Glide.with(context).load(url).apply(options).into(imageView);
其实可以分为三段,这个属于链式调用。先看第一段,初始化。Glide.with(context)。首先是获取一个RequestManagerRetriever。 Glide.get(context).getRequestManagerRetriever()
那么先看下Glied.get(context) ,Glide的对象获取。这个不打算展开了,主要是初始化数据。其实主要是针对这些数据展开分析才合适。RequestManagerRetriever 根据Activity,Fragment,AppicationContext 不同来获取RequestManager。这里虽然是通过Factory模式来获取的RequestManager,最终还是调用的他的构造方法。简单说些这个构造方法做了哪些事。主要是添加了生命周期到主线程。
RequestManager(
Glide glide,
Lifecycle lifecycle,
RequestManagerTreeNode treeNode,
RequestTracker requestTracker,
ConnectivityMonitorFactory factory,
Context context) {
this.glide = glide;
this.lifecycle = lifecycle;
this.treeNode = treeNode;
this.requestTracker = requestTracker;
this.context = context;
connectivityMonitor =
factory.build(
context.getApplicationContext(),
new RequestManagerConnectivityListener(requestTracker));
// If we're the application level request manager, we may be created on a background thread.
// In that case we cannot risk synchronously pausing or resuming requests, so we hack around the
// issue by delaying adding ourselves as a lifecycle listener by posting to the main thread.
// This should be entirely safe.
if (Util.isOnBackgroundThread()) {
mainHandler.post(addSelfToLifecycle);
} else {
lifecycle.addListener(this);
}
lifecycle.addListener(connectivityMonitor);
setRequestOptions(glide.getGlideContext().getDefaultRequestOptions());
glide.registerRequestManager(this);
}
第二部:load(Url)。继续分析。生成了一个RequestBuilder,调用其load(Url),调用load(Url)也仅仅把Url当做model(Object)设置进去。
第三部:into(ImageView)。还是在RequestBuilder 里面调用的。此方法落脚方法,触发了一些列调用。第一步就是创建了一个Request 先不管创建哪种类型的Request。(实际就两种,ThumbnailRequestCoordinator和SingleRequest) 然后target.setRequest(request);
requestManager.track(target, request); 最后面一句话会runRequest,进而调用 request.begin();我们这里查看SingleRequest的begin。主要查看onSizeReady,调用请求的方法在engine.load。其中会创建
EngineJob属于线程池,DecodeJob属于runnable,或者叫做任务。所以定位到run方法。
最终要定位到currentGenerator.startNext()。这个可以叫做DataFetcherGenerator的startNext。我们可以将注意力到SourceGenerator这个DataFetcherGenerator。这个从字面意思可以看到就是获取数据嘛。
loadData.fetcher.loadData(helper.getPriority(), this) 所以需要看下fetcher有哪些。从网络获取数据就是HttpUrlFetcher。由这个类从网络获取数据。在这章我只是把大概轮廓勾勒出来,要分析源码从里面具体的类作用分析。先对大概流程有个印象吧。
本文详细剖析了Android图片加载库Glide的源码实现,从初始化RequestManager到load方法,再到into ImageView的整个过程,重点讲解了数据加载机制和关键组件的作用。
616

被折叠的 条评论
为什么被折叠?



