图片加载框架:Glide 实现原理

it2023-04-10  71

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

最新回复(0)