glide主流程主要为:
首先我们调用Glide.with(this),它会去调用getRetrievet()方法,而用getRetrvievet它会调用get方法用双重检验单例的模式去注册并获取Glide实例,
在注册过程中它会初始化Retriever和在registerFactory注册各种类型loader的加载器,
获取到Retriever后调用内部的get(),里面主要是注册加载生命周期和返回一个requestManager。如果是子线程或者传入的生命周期不是activity和fragment,这次的加载周期就会和application一样。是的话会获取其的lifecycle并生成requestManager返回。
load()的话主要是保存url并返回requestBuilder。
into()会先去获取view的缩放类型和参数,接着会先构建ImageTarget和SingleRequest,判断当前ImagerTarget有没有request,有就会判断当前请求是否等于上个请求,是就会继续之前的请求,不是就会清除上个请求。接着会调用requestmanager的track方法,先把target添加到targetTracker进行管理,这里主要是管理动画。然后会调用runRequest方法,如果现在页面不是暂停状态就会添加到Requests并begin,是会添加到pendingRequests等页面恢复再开始请求。
接着调用singlerequest的begin方法,begin方法会先获取目标尺寸,然后调用onSizeReady(),里面会调用engine.load方法,load方法会先生成一个EngineKey,
然后会用key去查看内存中有没有,有会直接从内存中拿,没有则会调用开启新的任务的方法。
在这个方法中,创建一个engineJob和一个decodeJob(engineJob主要是负责加载任务的,decodeJob这是负责解码相关的任务),接着会调用enginejob的start方法去执行decodeJob任务,start方法会判断当前任务是磁盘缓存任务还是网络缓存任务去获取不同的线程池,然后用获取到的线程池执行任务。
接着会来到decodeJob类执行里面的run方法。然后会根据不同阶段去获取下一个生成器,这里是SourceGenerator。执行里面的startnext方法,接着会获取loadData类型,因为我们传的是String类型的url,所以这里会用HttpGlideUrlLoader生成器去获取loadData,HttpGlideUrlLoade则是会返回HttpUrlFetcher。
然后会调用HttpUrlFetcher的loadData方法。load里面主要是用HttpURLConnection去获取inputStream流,获取完会调用onDataReady把结果返回过去
接着会回调回去。会让decodeJob中的run再执行一边。这里会重复之前的流程,一直到startnext方法,
此时datatoCache是刚才从网络获取的inputSteam不再是空,会调用cacheData方法,
方法主要是把数据存在磁盘,然后把生成器换成DataCacheGenerator,接着流程跟之前一样执行生成器的startnext方法,里面获取loadData并执行load方法,只不过这里的生成器是
DataCacheGenerator,对应的加载器是ByteBufferFileLoader,所以会执行ByteBufferFetcher的load方法。load方法会从文件中读取图片的字节流,回调给 DataCacheGenerator。
接下来的流程是有关解码的,会一路来到DecodePath的decode方法,这个方法里面会调用方法通过ByteBufferBitmapDecoder的decode方法 调用downsampler的decode方法来将 ByteBuffer 数据转换为bitmap泛型Resource实现类,然后回调用DecodeJob里面的方法设置图片参数。
到这里数据已经解析完了,最终会走到DrawableImageViewTarget类的setResource方法,将图片设置到ImageView上。
这里只是简单走一下主流程,希望对你们有帮助。