图片加载框架: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创建一份记录写入日志文件中,并把图片资源流写入磁盘缓存中