Glide-v4.11.0源码流程图
2020-10-12 15:30:17 0 举报
Glide-v4.11.0源码流程
作者其他创作
大纲/内容
21:cacheData
StreamBitmapDecoder
15:onResourceReleased
1、弱引用变量缓存以及Lru缓存
一、基础的Glide使用过程:Glide.with(context).load(String url).init(imageView)
2:getRetriever
13:start
17:run
14:release
9:notifyCallbacksOfResult
BitmapDrawableTranscoder
4:run
15:loadGeneric
20:startNext
10:onSizeReady(有资源图片的情况)
12:waitForExistingOrStartNewJob
返回Resource对象
2:loadFromMemory
SourceGenerator
DecodeHelper
RequestManager
7:remove
22:obtain
9:load
37:setResourceInternal
7:getDecoders
Transformation
返回解码器列表
21:loadDataWithRedirects
16:runWrapped
DecodeJob
EngineJob
1:decodeFromRetrievedData
19:startNextLoad
14、decode
8:runGenerators
18:runWrapped
ActiveResources
5、initializeGlide
4、checkAndInitializeGlide
18:onResourceDecoded
EngineJop
3:loadFromActiveResources
31:execute
8:runLoadPath
4:getLoadPath
HttpUrlFetcher
返回LoadPath对象
3:execute
35:onResourceReady
4:runRequest
16:execute
24:decodeFromData
1、初始化参数流程:Glide.with(context).load(String url)
12:onDataReady
38:setResource
返回存储对象EngineResource
9:get
5:begin
3:track
7:get
2:start
10:supportFragmentGet
Engine
11:load
2、加载与展示流程:Glide.with(Context context).load(xxxx).into(view)
LruCache
1:into
10:loadData
34:onResourceReady
二、解码器、转码器操作过程:主要是在第一部分第2节中的26步
20:loadData
17:runGenerators
返回Resource封装对象
26:decodeFromRetrievedData
返回裁剪Transformation对象
manager/RequestManagerRetriever
11、decode
10、loadWithExceptionList
23:decodeFromRetrievedData
6:getRequestManagerRetriever
RequestBuilder
15:decode
DecodePath
26:DeferredEncodeManager/encode
10:incrementPendingCallbacks
Glide.with返回RequestManager对象, 11:load
19:runGenerators
8:onLoadFailed
3: get
15:reschedule
2、into
20:transform
16:put
每个步骤的解释:1、Glide中有多个with重构方法,用于接收Application、Activity、View、Fragment、FragmentActivity参数,通过这些参数获取到当前界面运行的上下文2、获取一个请求管理检索器RequestManagerRetriever, 该对象主要是获取返回一个请求管理器, 进行生命周期管理, 网络请求管理, 展示设置管理等3、初始化一个GlideBuilder以及初始化一个注解解析模块, 解析模块通apt生成代码机制生成注解对应的模块代码4、初始化GlideBuilder过渡方法,增加是否在初始化过程的判断, 防止没有初始化结束而进行多次初始化5、定义一个manifest解析器, 解析manifest文件注册的注解模块并且存入列表对象中,将已经在代码设置的注解模块加入列表中; 定义请求管理检索器工厂类;初始化GlideBuilder对象,GlideBuilder对象的build方法里初始化了sourceExecutor(原始资源处理线程池)、diskCacheExecutor(磁盘存储线程池)、animationExecutor(动画管理线程池)、MemorySizeCalculator(内存大小计算器)、connectivityMonitorFactory(网络链接器工厂类)、bitmapPool(图像处理池)、arrayPool(列阵池)、memoryCache(LRU弱应用变量与内存缓存操作类)、diskCacheFactory(LRU磁盘存储工厂类)、Engine(引擎类,主要类,处理一系列逻辑,包括网络请求图片、内存、磁盘、请求流的解码等操作)、RequestManagerRetriever(请求管理检索器, 主要管理监听, 回调监听等等);将初始化的GlideBuilder对象注册到注解模块,apt生成类用到;最后创建出Glide对象,实现ImageViewTargetFactory图片控件工厂类, 该类的具体实现是调用ImageView控件最终设置图片展示给用户以及处理动画效果等等,然后定义一个GlideContext来作为Glide上下文管理以上初始化的所有对象6、获取初始化好的RequestManagerRetriever请求管理检索器7、RequestManagerRetriever请求管理检索器有多个get重构方法, 用于接收Application、Activity、View、Fragment、FragmentActivity, Context参数, 其中接收context参数里面做了具体上下文对象进行分发;当是在主线程并且是界面上下文时, 此时通过自定义一个隐形SupportRequestManagerFragment来进行生命周期的管理(跟随组件生命周期), 用于管理开始、暂停、移除以及释放等操作; 如果当前在子线程或者主线程的Application上下时, 此时Glide就是整个应用是生命周期(跟随Application组件的生命周期),用于管理开始、暂停、移除以及释放等操作8、当是子线程或者是主线程中的Application上下文时,初始化Application生命周期对象, 创建RequestManager请求管理器,进行生命周期管理, 网络请求管理, 展示设置管理等9、当是主线程并且是界面上下文时,进入具体上下文分发过程10、当是主线程并且是界面上下文时,获取fragment管理器,定义一个隐形getSupportRequestManagerFragment界面进行生命周期管理,创建RequestManager请求管理器,进行生命周期管理, 网络请求管理, 展示设置管理等11、RequestManager对象中有多个load重构方法, 用于接收Bitmap、Drawable、String(链接)、Uri、File、resourceId、URL、Object、byte[]参数,这些参数直接代表需要加载的资源12、创建一个RequestBuilder请求构造类, 该类非常重要,用于接收自定义的配置条件、监听回调以及清理缓存释放资源等,是into的入口13、创建一个RequestBuilder请求构造类过渡方法14、RequestBuilder对象中有多个load重构方法, 用于接收Bitmap、Drawable、String(链接)、Uri、File、resourceId、URL、Object、byte[]参数,这些参数直接代表需要加载的资源15、将需要加载的资源通过Object对象缓存在model变量中, 如果是非网络请求资源一般是本地资源, 不需要通过磁盘存储,则会调用apply方法进行磁盘存储配置设置为不需要磁盘存储模式总结:Glide.with(context).load(xxx)进行了一系列的初始化化操作,包括线程池、网络请求的准备、缓存与磁盘存储的准备、解析器以及生命周期管理,最大特点就是采用了隐形fragment来管理生命周期、各种抽象的定义写法以及工厂模式的使用等,给我们有个焕然一新的代码实现逻辑流程, 值得我们细品学习
Glide
9:setDrawable
5:getLoadPath
12:asDrawable
获取缓存资源步骤:1、调用Engine类的load方法,首先定义存储的key,通过对参数拼接的hash code来确定这个key值,确保唯一性,根据定义的hash code key值在本地查找加载弱应用变量缓存或者LRU缓存资源,如果本地已经有改资源对象,那么就跳过加载资源(网络或者磁盘资源)通过onResourceReady()方法回调进入BitmapImageViewTarget或者DrawableImageViewTarget进行图片展示设置到控件View,否则进入网络或者磁盘资源加载2、查找缓存是否有对应key值的资源,首先会查找当前运行状态应用是否有弱引用变量缓存,调用loadFromActiveResources()方法查找;当弱引用变量缓存不存在时则会查找Lru内存缓存,调用loadFromCache()查找3、调用loadFromActiveResources()方法通过key获取缓存对象EngineResource, EngineResource对象中有个acquired参数记录使用频率, 当acquired=0时会触发回收该对象,否则代表常用对象资源不被回收,具体回收回调会调用ResourceListener接口onResourceReleased()回调方法,调用该方法时如果设置了缓存存储, 那么就先存储在缓存中, 否则调用ResourceRecycler对象的recycle()方法进行回收对象,即是清除变量存储中的EngineResource对象4、调用ActiveResources类的get方法获取EngineResource对象, ActiveResources是在Engin类创建时创建的,该类中有一个activeEngineResources变量Map集合,该集合是缓存ResourceWeakReference弱引用对象,EngineResource对象封装在ResourceWeakReference弱引用对象对象中存储在Map集合,当调用ActiveResources类的get方法会根据key获取ResourceWeakReference弱引用对象,如果ResourceWeakReference弱引用对象获取EngineResource对象为空,那么就调用ResourceListener接口onResourceReleased()回调方法进行对象回收清除5、通过Lru缓存获取EngineResource对象, 如果获取的资源对象不为空,那么就将记录使用频率增加1,然后调用ActiveResources类的activate()方法将资源对象缓存到弱引用Map变量缓存集合6、调用getEngineResourceFromCache方法用过key获取EngineResource对象,首先通过 LruResourceCache对象获取存储的Resource对象,如果Resource对象非EngineResource对象则创建一个新的EngineResource对象将Resource对象封装进去返回;LruResourceCache对象在GlideBuilder对象创建的时候建立的, 该对象继承LruCache类(Lru缓存实现者)以及实现MemoryCache接口,LruCache类中采用LinkedHashMap来实现Lru算法存储, LruCache的意思就是近期最少使用算法存储(有大小限定,一般是可用内存的 1/8, 此处是Glide自定义类,可以设置控制大小),采用LinkedHashMap的特性, 当超过限定存储大小则会删除链表前部不常使用的节点缓存对象,LinkedHashMap是双向链表结构的Map进行存储,原理:把一个缓存对象作为一个节点p, (1)、该存储对象节点p持有上一个存储对象节点对象,则上一个存储对象节点为p.before (就是p指向上一个节点的对象),(2)、该存储对象节点p持有下一个存储对象节点对象,则下一个存储对象节点为p.after (就是p指向下一个节点的对象),因此:一个缓存对象节点是持有上一个和下一个存储对象的节点对象引用,所以形成链的样式一个接连一个并且相互持有,称为双向链表(单向链表就是只持有下一个节点对象的链表),LinkedHashMap是将很少取用的对象放在链表前部,将最近常用对象放在链表尾部,当通过get方法获取到存储对象时,则会把获取节点移动到链表尾部7、调用LruCache类(Lru缓存实现者)的remove()方法,里面是通过调用LinkedHashMap的remove()来获取存储值,调用该方法会先取出对应key的存储值,然后将该存储值在map中删除,最后将取出的值存储到LinkedHashMap的尾部8、当通过LruCache类获取到的缓存值不为空时,则会调用ActiveResources类的activate()方法将资源对象缓存到弱引用Map变量缓存集合存储资源步骤:9、调用notifyCallbacksOfResult方法,此方法是经过网络请求数据,然后将数据解码转码处理后调用,主要是进行弱引用与Lru内存变量缓存, 缓存当前解码后的资源数据;首先创建EngineResource对象,将EngineResource类acquired变量增加1, 该变量为记录使用频繁次数;然后调用Engine类的onEngineJobComplete()方法进行弱引用变量map集合存储,最后调用EngineResource类的release()方法进行Lru缓存10、将EngineResource类acquired变量增加1, 该变量为记录使用频繁次数,当acquired=0触发回收弱引用变量并且进行Lru缓存,Lru存储功能是默认开启的,可以通过设置关闭,关闭后将不进行Lru存储11、调用Engine类的onEngineJobComplete()方法进行弱引用变量map集合存储,调用ActiveResources类的activate()方法进行变量存储12、调用ActiveResources类的activate()方法,将资源数据缓存在activeEngineResources变量map集合中13、调用decrementPendingCallbacks方法进行Lru缓存操作,首先获取到EngineResource对象调用release()方法进一步操作14、调用到EngineResource对象调用release()方法,对acquired变量值进行判断,小于等于0则抛出异常,当不小于0则做递减操作, 当acquired=0则会触发Engine类的onResourceReleased()回调方法调用进行操作15、调用Engine类的onResourceReleased()回调方法,先将弱引用变量缓存停用删除然后判断是否打开Lru缓存配置,打开则调用LruCache类的put()方法进行数据存储,否则调用ResourceRecycler对象的recycle()方法将资源对象清除回收16、调用LruCache类的put()方法进行数据存储;到此Lru缓存就完成了,当需要使用的时候就回到1步骤,采用key进行查找
1:load
3:decodeFromFetcher
23:startNextLoad/onDataReady
EngineJob.CallResourceReady/32:run
22:onDataFetcherReady
15:run
13、decodeResourceWithList
16:decodeFromWrappedStreams
29:onResourceReady
30:notifyCallbacksOfResult
22:getStreamForSuccessfulRequest
6:getEngineResourceFromCache
SingleRequest
EngineResource
12:activate
36:onResourceReady
13:onDataReadyInternal
6:onLoadFailed(未传图片资源的情况)
27:notifyEncodeAndRelease
9:startNext
13:as
返回裁剪转码后的Resource对象
7:getNextGenerator
读取磁盘存储步骤: 在读取磁盘存储之前,首先需要了解磁盘的创建时机,Lru磁盘存储创建是在Glide对象创建之前创建的,也就是在GlideBuilder的build方法中通过创建InternalCacheDiskCacheFactory对象创建的,InternalCacheDiskCacheFactory对象继承DiskLruCacheFactory工厂类,DiskLruCacheFactory工厂类的build方法创建DiskLruCacheWrapper对象,DiskLruCacheWrapper对象是磁盘存储的包装类,是管理磁盘存储的门面,持有磁盘存储操作实际对象DiskLruCache, DiskLruCache类是磁盘存储的真正实现, 通过文件存储到缓存目录下,内部有LinkedHashMap实现,通过LinkedHashMap间接提供数据,当从磁盘中获取到存储数据则缓存在LinkedHashMap集合中,当存储数据是同时存储到LinkedHashMap集合及磁盘中,这样避免频繁文件读写操作1、在第一部分第2节11步可以知道, 调用Engine类的load是进入资源开始加载的逻辑, 在Engine创建时会创建一个LazyDiskCacheProvider对象, 该对象是Lru磁盘存储懒加载提供者,只有在真正使用磁盘存储才创建DiskLruCacheWrapper对象, DiskLruCacheWrapper是管理磁盘存储的门面,持有磁盘存储操作实际对象DiskLruCache, DiskLruCache类是磁盘存储的真正实现;当需要需要使用磁盘存储时通过LazyDiskCacheProvider提供者即可操作磁盘存储2、调用到EngineJob类start()方法, 开启一个线程池来进行资源加载, 首先判断存储策略(通过自定义设置是否磁盘存储以及磁盘存储的类型,类型包括DiskCacheStrategy.NONE: 表示不使用磁盘缓存;DiskCacheStrategy.DATA: 表示磁盘缓存只缓存原始加载的图片; DiskCacheStrategy.RESOURCE: 表示磁盘缓存只缓存经过解码转换后的图片;DiskCacheStrategy.ALL: 表示磁盘缓存既缓存原始图片,也缓存经过解码转换后的图片; DiskCacheStrategy.AUTOMATIC: 表示让Glide根据图片资源智能地选择使用哪一种磁盘缓存策略,该选项也是我们在不进行手动设置的时候Glide的默认设置), 如果此作业将尝试从磁盘缓存中解码资源,则采用磁盘工作线程池,该线程池只有一个公共线程,因此该线程池的操作是同步操作;如果它将始终从源解码(网络请求),则采用活动线程池3、调用线程池execute方法执行资源加载工作4、在线程池执行到DecodeJob类的run方法, 判断生命周期是否暂停,没有则调用runWrapped进入下一步5、调用runWrapped方法,获取存储状态以及存储方式6、调用getNextStage方法,获取存储状态7、调用getNextGenerator方法,获取存储数据模式,主要有ResourceCacheGenerator(磁盘存储之一,获取存储解码转码后的数据)、DataCacheGenerator(磁盘存储之一, 获取存储原数据)以及SourceGenerator(弱引用变量存储以及LRU内存缓存, 网络请求获取原数据);记下来以ResourceCacheGenerator存储模式来分析8、调用runGenerators()方法,通过遍历调用不同存储模式的startNext()方法判断是否有存储数据9、调用ResourceCacheGenerator类的startNext()方法, 找到getDiskCache()方法的逻辑, 此处是通过key从磁盘获取存储数据,获取到数据会调用DataFetcher的类实现接口loadData()方法进行数据处理分发, 最后通过接口回调到ResourceCacheGenerator类的onDataReady()方法10、调用DataFetcher的类实现接口loadData()方法进行数据处理分发11、通过接口回调到ResourceCacheGenerator类的onDataReady()方法,到此从磁盘获取数据完成,之后是展示资源图片(查看第一部分第2节23步类似流程)磁盘存储步骤:12、当通过SourceGenerator请求到网络数据时通过回调接口调用到onDataReady()方法,此时代表网络请求获取流对象数据13、调用onDataReadyInternal()方法,判断是否设置磁盘存储原数据,如果设置磁盘存储原数据,设置dataToCache存储数据,则会调用reschedule()回调方法执行线程池重新加载流程操作;否则则调用onDataFetcherReady()方法进行原数据解码转码进行资源转码数据磁盘存储,下面先分析reschedule()方法调用14、回调到DecodeJob类的reschedule()方法, 该方法是一个转发调用EngineJob类的reschedule()方法15、回调到EngineJob类的reschedule()方法, 获取到活动线程池后执行DecodeJob任务16、线程池调用execute()方法执行DecodeJob任务17、调用到DecodeJob类的run方法,判断生命周期,继续调用runWrapped()方法18、调用到runWrapped()方法,获取存储状态以及存储数据模式,当前因为网络请求,所以获取到SourceGenerator对象19、通过遍历执行每个获取存储数据的模式对象,由于是网络数据请求,执行到SourceGenerator对象的startNext()方法20、执行到SourceGenerator对象的startNext()方法,由于之前已经网络请求过获取到了数据,dataToCache数据不为空(这里是线程池执行了两次网络请求任务,第二次将不会再网络请求,而是会调用磁盘原数据存储),调用cacheData()进行原数据磁盘存储21、进行原数据磁盘存储,创建DataCacheGenerator(磁盘存储之一, 获取存储原数据)对象,然后startNext()方法调用到DataCacheGenerator对象的startNext()方法获取到磁盘数据继续执行图片展示(查阅读取磁盘存储步骤第9步),到此原数据磁盘存储完成22、回到13步的磁盘存储方式判断,当没有设置原数据存储时,则会进行解码转码数据磁盘存储,调用回调方法onDataFetcherReady()23、回调到DecodeJob类onDataFetcherReady()方法, 首先会进行原数据解码转码,并且会把解码转码成功的数据初始化到DeferredEncodeManager对象中,DeferredEncodeManager对象是管理解码转码存储磁盘的类,然后进行数据展示,最后判断是否需要磁盘存储解码转码数据,需要则调用DeferredEncodeManager对象的encode()方法进行磁盘存储24、进行原数据解码转码,并且会把解码转码成功的数据初始化到DeferredEncodeManager对象中25、进行数据展示,判断是否需要磁盘存储解码转码数据,需要则调用DeferredEncodeManager对象的encode()方法进行磁盘存储26、调用DeferredEncodeManager对象的encode()方法进行磁盘存储,到此资源解码转码数据磁盘存储完成
8:getApplicationManager
解码器分析步骤: 在进行分析之前,我们需要回顾解码器的创建时机,也就是Glide创建的时候,会创建一个Registry对象,该对象是用于管理各种操作类,此时会创建解码器:ByteBufferBitmapDecoder(字节缓冲区位图解码器)、StreamBitmapDecoder(流位图解码器,将InputStream流解码成bitmap,然后能将bitmap转换成Drawable的转码器)、StreamGifDecoder(流Gif解码器)等等,然后将创建的解码器添加入Registry对象中,实际是添加到ResourceDecoderRegistry对象的HashMap中,当需要使用到解码器通过key(解码器的区分类型)在ResourceDecoderRegistry对象的HashMap中获取对应解码器,下面将通过StreamBitmapDecoder类来进行分析1、当网络请求成功后返回流数据,此时调用decodeFromData()方法进行下一步数据解码2、过渡方法,对数据进行判空,不为空则调用decodeFromFetcher()方法3、获取解码器列表的管理对象LoadPath对象, 通过DecodeHelper类getLoadPath获取,该类的初始化是在DecodeJob类初始化时初始化的,与加载数据管理LoadData对象类似(在第一部分的第2小节18步),当获取到解码器管理对象则调用runLoadPath()方法进入下一步处理4、调用DecodeHelper类的getLoadPath()方法获取LoadPath对象5、调用Registry类的getLoadPath()方法获取LoadPath对象,首先获取解码器列表,每个解码器封装在DecodePath类对象中,该对象是解码器具体管理对象;然后创建一个LoadPath对象管理解码器列表并且返回6、解码器DecodePath列表的获取, 在ResourceDecoderRegistry对象的HashMap中获取对应解码器,创建DecodePath对象, 将解码器封装到DecodePath对象中,最后将DecodePath对象加入列表中进行返回7、调用ResourceDecoderRegistry类getDecoders()方法,在ResourceDecoderRegistry对象的HashMap中获取对应解码器并且返回8、调用DecodeJob类的runLoadPath()方法,获取硬件加速的配置(如果有设置的话),创建一个DecodeCallback接口回调类,实现onResourceDecoded()方法,解码成功回调到此方法,最后调用LoadPath类的load()方法,将DecodeCallback接口回调类以及数据源传入进行解密9、调用LoadPath类的load()方法,该方法是一个过渡方法,继续调用loadWithExceptionList()方法10、通过遍历获取DecodePath对象,然后调用DecodePath类的decode()方法进行解密器解码, DecodePath对象是解码器的具体管理对象11、调用DecodePath类的decode()方法,首先调用decodeResource()方法进行数据解码, 通过DecodeCallback接口回调类的onResourceDecoded()方法回调到DecodeJob类中,进行转码数据管理类初始化等等,最后设配硬件加速返回Resource解码成功的资源对象12、decodeResource()方法为过渡方法,具体实现在decodeResourceWithList()方法13、通过遍历获取具体的解码器,然后调用解码器的decode()方法进行数据解码(此处采用StreamBitmapDecoder解码器进行分析)14、调用StreamBitmapDecoder类的decode()方法, 进行流封装,用于读取数据,确保在读取图像标头后始终可以进行重置,以便即使标头解码失败和/或读取缓冲区溢出,我们仍然可以尝试对完整图像进行解码,然后调用Downsampler类的decode()方法,对图像exif格式进行采样、解码和旋转,Downsampler对象是在Glide创建时创建出来的15、调用Downsampler类的decode()方法,创建BitmapFactory.Options对象进行初始化配置,然后调用decodeFromWrappedStreams方法进行解码16、处理宽高,处理展示类型、处理旋转、处理缩放等等,调用decodeStream()方法进行流转Bitmap对象解码17、采用BitmapFactory.decodeStream系统方法将InputStream流解析成了bitmap,而最终Downsampler对象的decode方法返回的Resource对象就是BitmapResource对象18、通过DecodeCallback接口回调类的onResourceDecoded()方法回调到DecodeJob类中,获取到具体的裁剪转码器进行数据裁剪等;初始化转码数据管理类DeferredEncodeManager, 此类管理将转码数据存储到磁盘中;最后返回转码成功的数据给DecodePath类进行数据封装19、调用DecodeHelper类的getTransformation()方法获取Transformation对象, 获取到默认的裁剪方式或者获取到自定义的裁剪方式,裁剪方式是存储在CachedHashCodeArrayMap中,是通过BaseRequestOptions抽象类进行管理,每一种裁剪方式都会对应Bitmap.class、Drawable.class、BitmapDrawable.class、GifDrawable.class四种对象,然后Map中会存在同一种裁剪方式会针对四种不同的资源类型,裁剪方式可以多种组合使用,多种裁剪方式会通过MultiTransformation对象封装在list集合中;最后返回具体的裁剪方式,例如:CenterCrop(图片原图的中心区域进行裁剪显示)对象, 最后通过TransformationUtils工具类进行算法计算转码裁剪资源图片20、调用具体实现的裁剪转码器,例如:CenterCrop(图片原图的中心区域进行裁剪显示)对象, 最后通过TransformationUtils工具类进行算法计算转码裁剪资源图片;该转码器的实现可以自定义,Glide提供了三种:CenterCrop(图片原图的中心区域进行裁剪显示),FitCenter(图片原始长宽铺满)和CircleCrop(圆形裁剪),可以根据自己需求实现21、对裁剪转码后的资源进行封装,相当于一种装饰模式,对资源管理22、封装成一个懒加载对象LazyBitmapDrawableResource, 在需要的时候才加载返回Resource对象;最后执行第一部分第2小节的27步,进行图片展示
解码成功,返回Resource对象
2、磁盘Lru存储
Downsampler
LoadPath
14:load
RequestTracker
ImageViewTarget
5:runWrapped
4:get
6:getNextStage
5:loadFromCache
13:decrementPendingCallbacks
8:activate
返回:RequestBuilder对象
14:execute
ResourceDecoderRegistry
DataFetcher
DrawableImageViewTarget
2:decodeFromData
7:setErrorPlaceholder
28:notifyComplete
1: with
三、存储:主要采用了LRU算法存储
11:onEngineJobComplete
Registry
14:reschedule
ResourceCacheGenerator
21:transcode
LazyBitmapDrawableResource
25:notifyEncodeAndRelease
18:startNext
返回:RequestManager对象
12、decodeResource
Glide.with(Context context).load(xxxx)返回对象RequestBuilder
17:decodeStream
24:onDataReadyInternal
25:onDataFetcherReady
19:getTransformation
33:callCallbackOnResourceReady
11:onDataReady
6:getDecodePaths
0 条评论
下一页