图片加载框架:Glide 实现原理
Glide图片加载框架Glide简单使用和缓存原理
https://blog.csdn.net/Wengwuhua/article/details/105892814
//
with load into
AppGlideModule
applyOptions GlideBuilder
builder.setDefaultRequestOptions
RequestOptions
Android 图片加载框架Glide主流程源码分析
https://blog.csdn.net/msn465780/article/details/79279555
//Request
Glide ComponentCallbacks2 RequestManager getRetriever
GlideModule
manifestModules.iterator
GlideModule
factory RequestManagerFactory
annotationGeneratedModule.applyOptions(applicationContext, builder);
annotationGeneratedModule.
applyOptions
builder.build
registerComponents
registerComponents glide //
GeneratedAppGlideModule
class.newInstance
可以看到根据Class文件名反射生成GeneratedAppGlideModuleImpl实例,这个类就是通过注解编译器在项目
编译阶段生成的.Java文件,如下图:
annotationProcessor
ann
applyOptions registerComponents
GlideModule
isManifestParsingEnabled
annotationGeneratedModule
module.applyOptions(applicationContext, builder);
registerComponents
module. glideBuilder
GlideRequests
GeneratedAppGlideModuleImpl
GeneratedRequestManagerFactory
getRequestManagerFactory
ComponentCallbacks2
RequestManager
with
getRetriever
supportFragmentGet
getSupportRequestManagerFragment
fm ,parentCoordinator
factory.build
final class GeneratedRequestManagerFactory implements RequestManagerRetriever.RequestManagerFactory {
GlideRequests glide lifecycle treeNode ,context
RequestBuilder.load asDrawable.load
return as(Drawable.class);
resourceClass
RequestBuilder resourceDrawableDecoder
transcodeClass = Drawable.class
数 transcodeClass、defaultRequestOptions,后面会用到,到这里load()步骤就完毕vvvv
defaultRequestOptions,后面会用到,到这里load
vvvvv99
GlideRequest. RequestBuilder
Transcode
ViewTarget ImageView,TranscodeType into ImageView imageView
requestOptions
RequestBuilder TranscodeType
ViewTarget into
getScaleType
requestOptions.clone
glideContext.buildImageViewTarget(view, transcodeClass),
imageViewTargetFactory
buildTarget
ViewTarget<ImageView,Z>
BitmapImageViewTarget
DrawableImageViewTarget
ViewTarget<ImageView,TranscodeType>
glideContext.
buildImageViewTarget view ,transcodeClass,requestOptions
Y Target TranscodeType
options = options.clone .autoClone
target.getRequest
request previous
SingleRequest
RequestBuilder TranscodeType
buildRequest
buildRequestRecursive
target,targetListener
transitionOptions
RequestBuilder
obtainRequest
target targetListener,requestOptions
coordinator,
buildRequestRecursive
getThumbnailPriority
transitionOptions
coordinator.setRequests
RequestBuilder<TranscodeType>
obtainRequest
SingleRequest.obtain
target,RequestListener targetListener
RequestOptions options
buildRequest
SingleRequest Request
SizeReadyCallback ResourceCallback
begin
onResourceReady DataSource.MemoryCache
onResourceReady
onSizeReady
target.getSignature(this);
target.onLoadStarted(getPlaceholderDrawable());
GlideRequest.override(int overrideWidth, int overrideHeight)
ViewTarget getSize
onSizeReady
getTargetHeight getTargetWidth
load
.addOnPreDrawListener
getDiskCacheStrategy
getTransformations
isMemoryCacheable getOnlyRetrieveFromCache
engine.load
RequestManagerRetriever
Bitmap.StreamFactory
ResourceLoader.UriFactory
ResourceLoader.FileDescriptorFactory
BitmapEncoder
GifDecoder.class
StringLoader
DataUrlLoader
AssetUriLoader.StreamFactory
ImageViewTargetFactory
defaultRequestOptions,后面会用到,到这里load
defaultTransitionOptions
engine
glideContext
diskCacheFactory
diskCacheExecutor
sourceExecutor
RequestManagerRetriever
VideoBitmapDecoder
ByteBufferBitmapDecoder
StreamBitmapDecoder
ResourceBitmapDecoder
ResourceDrawableDecoder
StreamFactory
UriFactory
FileDescriptorFactory
BitmapDrawables
BitmapDrawableDecoder resources
byteBufferBitmapDecoder
BitmapDrawable.class
InputStream.class
UriFactory
loadFromActiveResources
EngineResource
onResourceReady MEMORY_CACHE loadFromCache
EngineJob、DecodeJob ,EngineJob相当于线程池
EngineJob DecodeJob SingleRequest target
executor.execute decodeJob
DataFetcherGenerator
decodeFromRetrievedData
ResourceCacheGenerator DataCacheGenerator SourceGenerator
getNextGenerator reschedule
currentGenerator
loadData.fetcher.loadData
DataFetcher loadData
AssetUriLoader HttpGlideUrlLoader
BitmapDrawableTranscoder
.register Bitmap GifDrawable.class
BitmapBytesTranscoder GifDrawableBytesTranscoder
.
BitmapBytesTranscoder
Factor DataFetcher
SourceGenerator startNext
getDiskCacheStrategy
loadData.fetcher.loadData
DecodeHelper Transcode
LoadData getLoadData
ModelLoader
modelLoader.buildLoadData model height,width,options
Registry
ModelLoaderRegistry
cache modelClass
MultiModelLoaderFactory
ModelLoaderFactory<>
Entry<Model,Data ModelLoader
loaders.add Model,object
Entry<Model, Data>
ModelLoaderFactory<? extends Model, ? extends Data> factory;
StreamFactory
StringLoader.StreamFactory
ParcelFileDescriptor FileDescriptorFactory
DataUrlLoader
ModelLoaderFactory<String,InputStream>
StringLoader ModelLoader <String,Data>
buildLoadData
Uri,Data
MultiModelLoader<Model, Data> implements ModelLoader<Model, Data> {
MultiModelLoader<Model,Data> ModelLoader
HttpUriLoader
ModelLoader
GlideUrl InputStream
buildLoadData
GlideUrl.class InputStream.class
HttpUriLoader mutiFactory.build
build ModelLoader Uri
GlideUri.class
headers.entrySet
DataFetcherGenerator
onDataReady
cb.onDataFetcherReady(loadData.sourceKey, data, loadData.fetcher,
loadData.fetcher.getDataSource(), originalKey);
DecodeJob
currentFetcher currentData currentDataSource
notifyComplete DataSource
callback.onResourceReady
MAIN_THREAD_HANDLER.obtainMessage(MSG_COMPLETE, this).sendToTarget();
handleResultOnMainThread
onEngineJobComplete
onEngineJobComplete
addCallback
handleResultOnMainThread
cb.
onResourceReady((Resource<R>) resource, (R) received, dataSource);
onResourceReady resource,received,dataSource
// 最终资源会加载回这里,找到target对应的类
target.onResourceReady(result, animation);
DrawableImageViewTarget
public class DrawableImageViewTarget extends ImageViewTarget<Drawable> {
...
@Override
protected void setResource(@Nullable Drawable resource) {
// 最后显示加载到的图片
view.setImageDrawable(resource);
}
...
}
setResource
newSourceExecutor newDiskCacheExecutor
MemorySizeCalculator.Builder.build
DefaultConnectivityMonitorFactory
LruBitmapPool BitmapPoolAdapter
LruResourceCache InternalCacheDiskCacheFactory
memoryCache diskCacheFactory
requestManagerRetriever
build.screenDimensions.getWidthPixels
bitmapPoolSize memoryCacheSize
EngineKey transformations
resourceClass
// 检查内存中弱引用是否有目标图片
EngineResource<?> active = loadFromActiveResources(key, isMemoryCacheable);
loadFromActiveResources
// 检查内存中弱引用是否有目标图片
EngineResource<?> active = loadFromActiveResources(key, isMemoryCacheable);
// 检查内存中Lrucache是否有目标图片
EngineResource<?> cached = loadFromCache(key, isMemoryCacheable);
LruCache loadFromCache
EngineJob<?> current = jobs.get(key, onlyRetrieveFromCache);
ResourceWeakReference
loadFromActiveResources
EngineResource
activeEngineResources ResourceWeakReference
Engine EngineJobListener
loadFromCache
activate acquire
Resource
EngineResource ResourceWeakReference
getReferenceQueue
Glide内存缓存 磁盘缓存
DiskCacheStrategy ALL
isDataCacheable isResourceCacheable
decodeCachedResource decodeCachedData
DataSource.MemoryCache
DataSource.RESOUR
RESOURCE: DiskCacheStrategy
DecodeJob DataFetcherGenerator
decodeFromRetrievedData
getNextStage
decodeCachedData
decodeCachedResource
ResourceCacheGenerator DataFetcherGenerator
Class<?>
ModelLoader<File, ?> modelLoader = modelLoaders.get(modelLoaderIndex++);
ModelLoader<File,?> modelLoader =
buildLoadData
ResourceCacheGenerator= ResourceCacheGenerator
ParcelFileDescriptor File
根据这个ByteBufferFileLoader去加载磁盘缓存图片文件然后一层一层回调回去显示
//
SourceGenerator startNext
loadData.fetcher.23();
// 实际发起请求的地方
loadData.fetcher.loadData(helper.getPriority(), this);
MemoryCache EngineResource.Re
LazyDiskCacheProvider DecodeJob
DiskLruCacheWrapper
return DiskLruCacheWrapper.create(cacheDir, diskCacheSize);
create====
PoolableDigestContainer
private final LruCache<Key, String> loadIdToSafeHash = new LruCache<>(1000);
LruCache<Key,String> loadIdToSafeHash
DiskLruCacheWrapper DiskCache
DiskLruCache
journalWriter BufferedWriter
line.startWith
diskCache.editor
lruEntries.get Entry
safeKeyGenerator.getSafeKey writeLocker.acquire safeKey
DiskLruCache.Editor editor = diskCache.edit(safeKey);
DiskLruCache.Editor
根据传入的URL和相关参数组成一个key,然后从内存缓存的弱引用中查找是否相应的图片资源,如果有
就返回,没有就从内存缓存的Lrucache缓存中查找,如果有就返回并存入弱引用缓存,如果没有就去查看
磁盘缓存,磁盘缓存有几种策略,常用的策略还是缓存转换后的图片,先加密key,然后去磁盘日志文件中
查找有没有记录,如果有就根据记录的文件名称获取图片文件并返回,如果没有记录,就从网络获取图片
资源流,根据加密key创建一份记录写入日志文件中,并把图片资源流写入磁盘缓存中