天天看点

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

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

继续阅读