Glide源碼解析一——Glide、Registry相關(guān)

ps:以下源碼分析基于Glide v4.11.0

Glide.jpg

涉及的類

主要涉及到以下這些類:

  1. Glide,全局唯一
  2. RequestManagerRetriever,用于獲取RequestManager
  3. RequestManagerFragment/SupportRequestManagerFragment,用于提供生命周期
  4. RequestManager,用于管理Request,內(nèi)部使用RequestTracker控制Reqeust的開始、暫停等
  5. RequestTracker,控制Reqeust的開始、暫停等
  6. Request,對應(yīng)著每一個圖片請求

數(shù)據(jù)處理的類型

  1. Model:輸入類型,例如請求的url、某個圖片文件、資源drawableId等等??梢詤⒖糆ngine的構(gòu)造函數(shù)中,Registry#append(...)添加的類型。
  2. Data/DataClass:數(shù)據(jù)源返回的類型,例如InputStream、ParcelFileDescriptor、File、ByteBuffer等??梢詤⒖糆ngine的構(gòu)造函數(shù)中,Registry#append(...)添加的類型。
  3. Resource/ResourceType/TResource:中間類型,從數(shù)據(jù)源返回的類型Data編碼成的類型,例如Bitmap、Drawable、GifDrawable、BitmapDrawable、File等。舉個例子:例如由InputStream編碼成Bitmap??梢詤⒖糆ngine的構(gòu)造函數(shù)中,Registry#append(...)添加的類型。
  4. transcode:最終返回的類型。從Resource轉(zhuǎn)換成的類型,例如BitmapDrawable、byte[]。舉個例子:由Bitmap轉(zhuǎn)換成BitmapDrawable、由Bitmap轉(zhuǎn)換成byte[]。可以參考Engine的構(gòu)造函數(shù)中,Registry#register(...)添加的類型。

從使用方法作為入口進(jìn)行分析:

Glide.with(activity)
    .load(url)
    .into(targetView);

Glide

Glide,是全局唯一的,當(dāng)我們調(diào)用Glide#get(context)時,會去判斷是否已經(jīng)實例化,沒有的話會實例化。

// Glide.java
public static RequestManager with(@NonNull View view) {
    return getRetriever(view.getContext()).get(view);
}
  
@NonNull
private static RequestManagerRetriever getRetriever(@Nullable Context context) {
    ...
    return Glide.get(context).getRequestManagerRetriever();
}

public static Glide get(@NonNull Context context) {
    if (glide == null) {
    
      // 獲取@GlideModule生成的GeneratedAppGlideModuleImpl類
      GeneratedAppGlideModule annotationGeneratedModule =
          getAnnotationGeneratedGlideModules(context.getApplicationContext());
      synchronized (Glide.class) {
        if (glide == null) {
          // 實例化Glide
          checkAndInitializeGlide(context, annotationGeneratedModule);
        }
      }
    }

    return glide;
}


private static void checkAndInitializeGlide(
      @NonNull Context context, @Nullable GeneratedAppGlideModule generatedAppGlideModule) {
    
    if (isInitializing) {
      throw new IllegalStateException(
          "...");
    }
    isInitializing = true;
    initializeGlide(context, generatedAppGlideModule);
    isInitializing = false;
}


private static void initializeGlide(
      @NonNull Context context, @Nullable GeneratedAppGlideModule generatedAppGlideModule) {
    initializeGlide(context, new GlideBuilder(), generatedAppGlideModule);
}


private static void initializeGlide(
      @NonNull Context context,
      @NonNull GlideBuilder builder,
      @Nullable GeneratedAppGlideModule annotationGeneratedModule) {
    Context applicationContext = context.getApplicationContext();
    List<com.bumptech.glide.module.GlideModule> manifestModules = Collections.emptyList();
    if (annotationGeneratedModule == null || annotationGeneratedModule.isManifestParsingEnabled()) {
      // 解析Manifest中注冊的自定義的GlideModule
      manifestModules = new ManifestParser(applicationContext).parse();
    }

    // ... 省略一些GlideModule和log相關(guān)的代碼

    RequestManagerRetriever.RequestManagerFactory factory =
        annotationGeneratedModule != null
            ? annotationGeneratedModule.getRequestManagerFactory()
            : null;
            
    // 設(shè)置RequestManagerFactory,后面用于創(chuàng)建RequestManager
    // 如果沒有@GlideModule生成的GeneratedAppGlideModuleImpl類,即factory為null,則使用RequestManagerRetriever類中的一個默認(rèn)Factory
    builder.setRequestManagerFactory(factory);
    
    // ... 省略應(yīng)用GlideModule相關(guān)代碼
    
    Glide glide = builder.build(applicationContext);
    
    // ... 省略應(yīng)用GlideModule相關(guān)代碼
    
    Glide.glide = glide;
}

Glide(
      @NonNull Context context,
      @NonNull Engine engine,
      @NonNull MemoryCache memoryCache,
      @NonNull BitmapPool bitmapPool,
      @NonNull ArrayPool arrayPool,
      @NonNull RequestManagerRetriever requestManagerRetriever,
      @NonNull ConnectivityMonitorFactory connectivityMonitorFactory,
      int logLevel,
      @NonNull RequestOptionsFactory defaultRequestOptionsFactory,
      @NonNull Map<Class<?>, TransitionOptions<?, ?>> defaultTransitionOptions,
      @NonNull List<RequestListener<Object>> defaultRequestListeners,
      boolean isLoggingRequestOriginsEnabled,
      boolean isImageDecoderEnabledForBitmaps) {
      
    this.engine = engine;
    
    // bitmap對象池
    this.bitmapPool = bitmapPool;
    
    // 數(shù)組對象池
    this.arrayPool = arrayPool;
    
    // 默認(rèn)是LruResourceCache
    this.memoryCache = memoryCache;
    
    // 用于根據(jù)參數(shù)(Application、Activity、FragmentActivity、Fragment、View)獲取RequestManager,詳見RequestManagerRetriever章節(jié)
    this.requestManagerRetriever = requestManagerRetriever;
    
    // 內(nèi)置了一系列的Entry,包含了ModelClass、DataClass、TransocdeClass、Encoder、Decoder、Transcoder等
    registry = new Registry();
    
    // Decoder
    ResourceDecoder<ByteBuffer, Bitmap> byteBufferBitmapDecoder;
    ResourceDecoder<InputStream, Bitmap> streamBitmapDecoder;
    if (isImageDecoderEnabledForBitmaps && Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
      streamBitmapDecoder = new InputStreamBitmapImageDecoderResourceDecoder();
      byteBufferBitmapDecoder = new ByteBufferBitmapImageDecoderResourceDecoder();
    } else {
      byteBufferBitmapDecoder = new ByteBufferBitmapDecoder(downsampler);
      streamBitmapDecoder = new StreamBitmapDecoder(downsampler, arrayPool);
    }
    
    // 創(chuàng)建ModelLoader的Factory,這里的StreamFactory創(chuàng)建的的是ModelLoader的子類ResourceLoader
    ResourceLoader.StreamFactory resourceLoaderStreamFactory =
        new ResourceLoader.StreamFactory(resources);
        
    // Transcoder
    BitmapBytesTranscoder bitmapBytesTranscoder = new BitmapBytesTranscoder();
    
    // 注冊Encoder
    registry
        .append(ByteBuffer.class, new ByteBufferEncoder())
        .append(InputStream.class, new StreamEncoder(arrayPool));
    
    // 注冊Decoder
    registry.append(Registry.BUCKET_BITMAP, ByteBuffer.class, Bitmap.class, byteBufferBitmapDecoder);
    
    // 注冊創(chuàng)建ModelLoader的Factory
    registry
        .append(int.class, InputStream.class, resourceLoaderStreamFactory)
        
    ...
    
    // 根據(jù)TranscodeClass創(chuàng)建ImageViewTarget的工廠類
    ImageViewTargetFactory imageViewTargetFactory = new ImageViewTargetFactory();
    
    // 用于之后獲取Registry等對象
    glideContext =
        new GlideContext(
            context,
            arrayPool,
            registry,
            imageViewTargetFactory,
            defaultRequestOptionsFactory,
            defaultTransitionOptions,
            defaultRequestListeners,
            engine,
            isLoggingRequestOriginsEnabled,
            logLevel);
      
}
// GlideBuilder.java
Glide build(@NonNull Context context) {
    
    ...
    
    // 用來獲取RequestManager對象(內(nèi)部使用RequestManagerFactory創(chuàng)建RequestManager)
    RequestManagerRetriever requestManagerRetriever =
        new RequestManagerRetriever(requestManagerFactory);
        
    ...
    
    return new Glide(
        context,
        engine,
        memoryCache,
        bitmapPool,
        arrayPool,
        requestManagerRetriever,
        connectivityMonitorFactory,
        logLevel,
        defaultRequestOptionsFactory,
        defaultTransitionOptions,
        defaultRequestListeners,
        isLoggingRequestOriginsEnabled,
        isImageDecoderEnabledForBitmaps);
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容