글 라 이 드 여행 - 레 지 스 트 리

42919 단어 glide
머리말
glide 는 구 글 이 추천 하 는 안 드 로 이 드 이미지 로 딩 프레임 워 크 로 우수한 캐 시 정책, Activity 의 라 이 프 사이클 계승, GIF 이미지 지원 등 이 잘 알려 진 곳 이다.다음은 glide 로 그림 을 불 러 오 는 호출 입 니 다.
private void loadImage() {
    Glide.with(this)
         .load("http://pic2.orsoon.com/2017/0118/20170118011032176.jpg")
         .into(ivTest);
}

그렇다면 이 프레임 워 크 는 어떻게 실제 작 동 되 는 것 일 까? 나 는 '글 라 이 드 여행' 시리즈 블 로 그 를 통 해 가능 한 한 내 마음 을 상세 하 게 기록 할 것 이다."Glide 의 여행" 시리즈 글 모음:
  • 글 라 이 드 여행 - 레 지 스 트 리
  • 글 라 이 드 여행 - DecodeJob
  • 개술
    Registry (com. bumptech. glide. Registry) 는 관리 임무 수행 대상 을 등록 하 는 관리 류 로 간단하게 이해 할 수 있다. Registry 는 하나의 공장 이 고 그 중에서 모든 등록 대상 은 하나의 공장 직원 이 며 임 무 를 배포 할 때 현재 임무 의 성격 에 따라 해당 직원 에 게 나 누 어 처리한다.
    분류 하 다.
    Registry 는 전체 glide 를 관리 하 는 데 필요 한 작업 수행 대상 으로 구체 적 으로 7 개의 등록 지점 으로 나 뉜 다.
  • com.bumptech.glide.load.model.ModelLoaderRegistry
  • com.bumptech.glide.provider.EncoderRegistry
  • com.bumptech.glide.provider.ResourceDecoderRegistry
  • com.bumptech.glide.provider.ResourceEncoderRegistry
  • com.bumptech.glide.load.data.DataRewinderRegistry
  • com.bumptech.glide.load.resource.transcode.TranscoderRegistry
  • com.bumptech.glide.provider.ImageHeaderParserRegistry

  • 등록 대상
    glide 가 초기 화 되 었 을 때 모든 요구 대상 이 등록 되 었 습 니 다.
    package com.bumptech.glide;
    
    ...
    
    public class Glide implements ComponentCallbacks2 {
    
        ...
    
        @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
        Glide(Context context,
              Engine engine,
              MemoryCache memoryCache,
              BitmapPool bitmapPool,
              ArrayPool arrayPool,
              ConnectivityMonitorFactory connectivityMonitorFactory,
              int logLevel,
              RequestOptions defaultRequestOptions) {
            this.engine = engine;
            this.bitmapPool = bitmapPool;
            this.arrayPool = arrayPool;
            this.memoryCache = memoryCache;
            this.connectivityMonitorFactory = connectivityMonitorFactory;
    
            DecodeFormat decodeFormat = defaultRequestOptions.getOptions().get(Downsampler.DECODE_FORMAT);
            bitmapPreFiller = new BitmapPreFiller(memoryCache, bitmapPool, decodeFormat);
    
            final Resources resources = context.getResources();
    
            registry = new Registry();
            registry.register(new DefaultImageHeaderParser());
    
            Downsampler downsampler = new Downsampler(registry.getImageHeaderParsers(),
                    resources.getDisplayMetrics(), bitmapPool, arrayPool);
            ByteBufferGifDecoder byteBufferGifDecoder =
                    new ByteBufferGifDecoder(context, registry.getImageHeaderParsers(), bitmapPool, arrayPool);
            registry.register(ByteBuffer.class, new ByteBufferEncoder())
                    .register(InputStream.class, new StreamEncoder(arrayPool))
                    .append(ByteBuffer.class, Bitmap.class, new ByteBufferBitmapDecoder(downsampler))
                    .append(InputStream.class, Bitmap.class, new StreamBitmapDecoder(downsampler, arrayPool))
                    .append(ParcelFileDescriptor.class, Bitmap.class, new VideoBitmapDecoder(bitmapPool))
                    .register(Bitmap.class, new BitmapEncoder())
                    .append(ByteBuffer.class, BitmapDrawable.class, new BitmapDrawableDecoder<>(resources, bitmapPool, new ByteBufferBitmapDecoder(downsampler)))
                    .append(InputStream.class, BitmapDrawable.class, new BitmapDrawableDecoder<>(resources, bitmapPool, new StreamBitmapDecoder(downsampler, arrayPool)))
                    .append(ParcelFileDescriptor.class, BitmapDrawable.class, new BitmapDrawableDecoder<>(resources, bitmapPool, new VideoBitmapDecoder(bitmapPool)))
                    .register(BitmapDrawable.class, new BitmapDrawableEncoder(bitmapPool, new BitmapEncoder()))
                    .prepend(InputStream.class, GifDrawable.class, new StreamGifDecoder(registry.getImageHeaderParsers(), byteBufferGifDecoder, arrayPool))
                    .prepend(ByteBuffer.class, GifDrawable.class, byteBufferGifDecoder)
                    .register(GifDrawable.class, new GifDrawableEncoder())
                    .append(GifDecoder.class, GifDecoder.class, new UnitModelLoader.Factory())
                    .append(GifDecoder.class, Bitmap.class, new GifFrameResourceDecoder(bitmapPool))
                    .register(new ByteBufferRewinder.Factory())
                    .append(File.class, ByteBuffer.class, new ByteBufferFileLoader.Factory())
                    .append(File.class, InputStream.class, new FileLoader.StreamFactory())
                    .append(File.class, File.class, new FileDecoder())
                    .append(File.class, ParcelFileDescriptor.class, new FileLoader.FileDescriptorFactory())
                    .append(File.class, File.class, new UnitModelLoader.Factory())
                    .register(new InputStreamRewinder.Factory(arrayPool))
                    .append(int.class, InputStream.class, new ResourceLoader.StreamFactory(resources))
                    .append(int.class, ParcelFileDescriptor.class, new ResourceLoader.FileDescriptorFactory(resources))
                    .append(Integer.class, InputStream.class, new ResourceLoader.StreamFactory(resources))
                    .append(Integer.class, ParcelFileDescriptor.class, new ResourceLoader.FileDescriptorFactory(resources))
                    .append(String.class, InputStream.class, new DataUrlLoader.StreamFactory())
                    .append(String.class, InputStream.class, new StringLoader.StreamFactory())
                    .append(String.class, ParcelFileDescriptor.class, new StringLoader.FileDescriptorFactory())
                    .append(Uri.class, InputStream.class, new HttpUriLoader.Factory())
                    .append(Uri.class, InputStream.class, new AssetUriLoader.StreamFactory(context.getAssets()))
                    .append(Uri.class, ParcelFileDescriptor.class, new AssetUriLoader.FileDescriptorFactory(context.getAssets()))
                    .append(Uri.class, InputStream.class, new MediaStoreImageThumbLoader.Factory(context))
                    .append(Uri.class, InputStream.class, new MediaStoreVideoThumbLoader.Factory(context))
                    .append(Uri.class, InputStream.class, new UriLoader.StreamFactory(context.getContentResolver()))
                    .append(Uri.class, ParcelFileDescriptor.class, new UriLoader.FileDescriptorFactory(context.getContentResolver()))
                    .append(Uri.class, InputStream.class, new UrlUriLoader.StreamFactory())
                    .append(URL.class, InputStream.class, new UrlLoader.StreamFactory())
                    .append(Uri.class, File.class, new MediaStoreFileLoader.Factory(context))
                    .append(GlideUrl.class, InputStream.class, new HttpGlideUrlLoader.Factory())
                    .append(byte[].class, ByteBuffer.class, new ByteArrayLoader.ByteBufferFactory())
                    .append(byte[].class, InputStream.class, new ByteArrayLoader.StreamFactory())
                    .register(Bitmap.class, BitmapDrawable.class, new BitmapDrawableTranscoder(resources, bitmapPool))
                    .register(Bitmap.class, byte[].class, new BitmapBytesTranscoder())
                    .register(GifDrawable.class, byte[].class, new GifDrawableBytesTranscoder());
    
            ImageViewTargetFactory imageViewTargetFactory = new ImageViewTargetFactory();
            glideContext = new GlideContext(context, registry, imageViewTargetFactory, defaultRequestOptions, engine, this, logLevel);
        }
    
        ...
    
    }

    ModelLoader Registry 의 등록 대상
    01. new MultiModelLoaderFactory.Entry(GifDecoder.class, GifDecoder.class, new UnitModelLoader.Factory())
    02. new MultiModelLoaderFactory.Entry(File.class, ByteBuffer.class, new ByteBufferFileLoader.Factory())
    03. new MultiModelLoaderFactory.Entry(File.class, InputStream.class, new FileLoader.StreamFactory())
    04. new MultiModelLoaderFactory.Entry(File.class, ParcelFileDescriptor.class, new FileLoader.FileDescriptorFactory())
    05. new MultiModelLoaderFactory.Entry(File.class, File.class, new UnitModelLoader.Factory())
    06. new MultiModelLoaderFactory.Entry(int.class, InputStream.class, new ResourceLoader.StreamFactory(resources))
    07. new MultiModelLoaderFactory.Entry(int.class, ParcelFileDescriptor.class, new ResourceLoader.FileDescriptorFactory(resources))
    08. new MultiModelLoaderFactory.Entry(Integer.class, InputStream.class, new ResourceLoader.StreamFactory(resources))
    09. new MultiModelLoaderFactory.Entry(Integer.class, ParcelFileDescriptor.class, new ResourceLoader.FileDescriptorFactory(resources))
    10. new MultiModelLoaderFactory.Entry(String.class, InputStream.class, new DataUrlLoader.StreamFactory())
    11. new MultiModelLoaderFactory.Entry(String.class, InputStream.class, new StringLoader.StreamFactory())
    12. new MultiModelLoaderFactory.Entry(String.class, ParcelFileDescriptor.class, new StringLoader.FileDescriptorFactory())
    13. new MultiModelLoaderFactory.Entry(Uri.class, InputStream.class, new HttpUriLoader.Factory())
    14. new MultiModelLoaderFactory.Entry(Uri.class, InputStream.class, new AssetUriLoader.StreamFactory(context.getAssets()))
    15. new MultiModelLoaderFactory.Entry(Uri.class, ParcelFileDescriptor.class, new AssetUriLoader.FileDescriptorFactory(context.getAssets()))
    16. new MultiModelLoaderFactory.Entry(Uri.class, InputStream.class, new MediaStoreImageThumbLoader.Factory(context))
    17. new MultiModelLoaderFactory.Entry(Uri.class, InputStream.class, new MediaStoreVideoThumbLoader.Factory(context))
    18. new MultiModelLoaderFactory.Entry(Uri.class, InputStream.class, new UriLoader.StreamFactory(context.getContentResolver()))
    19. new MultiModelLoaderFactory.Entry(Uri.class, ParcelFileDescriptor.class, new UriLoader.FileDescriptorFactory(context.getContentResolver()))
    20. new MultiModelLoaderFactory.Entry(Uri.class, InputStream.class, new UrlUriLoader.StreamFactory())
    21. new MultiModelLoaderFactory.Entry(URL.class, InputStream.class, new UrlLoader.StreamFactory())
    22. new MultiModelLoaderFactory.Entry(Uri.class, File.class, new MediaStoreFileLoader.Factory(context))
    23. new MultiModelLoaderFactory.Entry(GlideUrl.class, InputStream.class, new HttpGlideUrlLoader.Factory())
    24. new MultiModelLoaderFactory.Entry(byte[].class, ByteBuffer.class, new ByteArrayLoader.ByteBufferFactory())
    25. new MultiModelLoaderFactory.Entry(byte[].class, InputStream.class, new ByteArrayLoader.StreamFactory())

    Encoder Registry 의 등록 대상
    1. new EncoderRegistry.Entry(ByteBuffer.class, new ByteBufferEncoder)
    2. new EncoderRegistry.Entry(InputStream.class, new StreamEncoder(arrayPool))

    resourceDecoder Registry 의 등록 대상
    +) new ResourceDecoderRegistry.Entry(ByteBuffer.class, GifDrawable.class, byteBufferGifDecoder)
    +) new ResourceDecoderRegistry.Entry(InputStream.class, GifDrawable.class, new StreamGifDecoder(byteBufferGifDecoder, arrayPool))
    1. new ResourceDecoderRegistry.Entry(ByteBuffer.class, Bitmap.class, new ByteBufferBitmapDecoder(downsampler))
    2. new ResourceDecoderRegistry.Entry(InputStream.class, Bitmap.class, new StreamBitmapDecoder(downsampler,arrayPool))
    3. new ResourceDecoderRegistry.Entry(ParcelFileDescriptor.class, Bitmap.class, new VideoBitmapDecoder(bitmapPool))
    4. new ResourceDecoderRegistry.Entry(ByteBuffer.class, BitmapDrawable.class, new BitmapDrawableDecoder<>(resources, bitmapPool, new ByteBufferBitmapDecoder(downsampler)))
    5. new ResourceDecoderRegistry.Entry(InputStream.class, BitmapDrawable.class, new BitmapDrawableDecoder<>(resources, bitmapPool, new StreamBitmapDecoder(downsampler, arrayPool))
    6. new ResourceDecoderRegistry.Entry(ParcelFileDescriptor.class, BitmapDrawable.class, new BitmapDrawableDecoder<>(resources, bitmapPool, new VideoBitmapDecoder(bitmapPool)))
    7. new ResourceDecoderRegistry.Entry(GifDecoder.class, Bitmap.class, new GifFrameResourceDecoder(bitmapPool))
    8. new ResourceDecoderRegistry.Entry(File.class, File.class, new FileDecoder())

    리 소스 엔 코더 레 지 스 트 리 의 등록 대상
    1. new ResourceEncoderRegistry.Entry(Bitmap.class, new BitmapEncoder())
    2. new ResourceEncoderRegistry.Entry(BitmapDrawable.class, new BitmapDrawableEncoder(bitmapPool, new BitmapEncoder()))
    3. new ResourceEncoderRegistry.Entry(GifDrawable.class, new GifDrawableEncoder())

    DataRewinder Registry 의 등록 대상
    *) class, new ByteBufferRewinder.Factory()>
    *) class, new InputStreamRewinder.Factory(arrayPool)>

    Transcoder Registry 의 등록 대상
    1. new TranscoderRegistry.Entry(Bitmap.class, BitmapDrawable.class, new BitmapDrawableTranscoder(resources, bitmapPool))
    2. new TranscoderRegistry.Entry(Bitmap.class, byte[].class, new BitmapBytesTranscoder())
    3. new TranscoderRegistry.Entry(GifDrawable.class, byte[].class, new GifDrawableBytesTranscoder())

    ImageHeaderParserRegistry 의 등록 대상
    1. new DefaultImageHeaderParser()

    사용자 정의 등록 대상
    glide 내부 에 이미 등록 대상 이 고정 되 어 있 기 때문에 이미 등 록 된 대상 을 교체 할 수 없다 는 것 은 아니다.GlideModule (com. bumptech. glide. module. GlideModule) 인 터 페 이 스 를 실현 하면 glide 에서 okhttp 에 대한 지원 을 추가 하거나 교체 할 수 있 습 니 다.
    package com.bumptech.glide.integration.okhttp3;
    
    ...
    
    public class OkHttpGlideModule implements GlideModule {
        @Override
        public void applyOptions(Context context, GlideBuilder builder) {
            // Do nothing.
        }
    
        @Override
        public void registerComponents(Context context, Registry registry) {
            registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory());
        }
    }

    등록 대상 가 져 오기
    대상 이 등록 되 었 으 니 당연히 공사 운영 을 편리 하 게 할 때 수시로 호출 할 수 있 고 Registry 는 다음 과 같은 인 터 페 이 스 를 제공 하여 등록 대상 에 대한 획득 을 제공 합 니 다.
  • getLoadPath(Class, Class, Class)
  • getRegisteredResourceClasses(Class, Class, Class)
  • isResourceEncoderAvailable(Resource>)
  • getResultEncoder(Resource)
  • getSourceEncoder(X)
  • getRewinder(X)
  • getModelLoaders(Model)
  • getImageHeaderParsers()

  • getModelLoaders
    1. ModelLoader Registry 데이터 집합 에서 Entry 의 첫 번 째 전송 이 String (요청 한 그림 주 소 는 문자열 형식 이기 때 문) 인 데이터 항목 을 찾 습 니 다. 위의 데이터 집합 을 통 해 알 수 있 듯 이 조건 에 맞 는 것 은 다음 과 같 습 니 다.
    10. new MultiModelLoaderFactory.Entry(String.class, InputStream.class, new DataUrlLoader.StreamFactory())
    11. new MultiModelLoaderFactory.Entry(String.class, InputStream.class, new StringLoader.StreamFactory())
    12. new MultiModelLoaderFactory.Entry(String.class, ParcelFileDescriptor.class, new StringLoader.FileDescriptorFactory())

    2. 그러나 DataUrlLoader \ # handles (String) 의 대부분 상황 이 false 로 돌아 갈 수 있 기 때문에 실제 조건 에 부합 되 는 것 은 11 과 12 두 가지 입 니 다. 그러면 이 방법 으로 돌아 오 는 데이터 집합 은 두 개의 MultiModelLoader 로 구 성 됩 니 다.3. StringLoader. streamFactory \ # build (MultiModelLoader Factory) 에서 MultiModelLoader Factory. build (Uri. class, InputStream. class) 를 호출 했다 면, ModelLoader Registry 데이터 집합 에서 Entry 의 첫 번 째 전 파 는 Uri 이 고, 두 번 째 전 파 는 InputStream 의 데이터 항목 으로 조건 에 부합 하 는 것 은 다음 과 같다.
    13. new MultiModelLoaderFactory.Entry(Uri.class, InputStream.class, new HttpUriLoader.Factory())
    14. new MultiModelLoaderFactory.Entry(Uri.class, InputStream.class, new AssetUriLoader.StreamFactory(context.getAssets()))
    16. new MultiModelLoaderFactory.Entry(Uri.class, InputStream.class, new MediaStoreImageThumbLoader.Factory(context))
    17. new MultiModelLoaderFactory.Entry(Uri.class, InputStream.class, new MediaStoreVideoThumbLoader.Factory(context))
    18. new MultiModelLoaderFactory.Entry(Uri.class, InputStream.class, new UriLoader.StreamFactory(context.getContentResolver()))
    20. new MultiModelLoaderFactory.Entry(Uri.class, InputStream.class, new UrlUriLoader.StreamFactory())

    4. 위 에서 알 수 있 듯 이 하나의 MultiModelLoader 로 ModelLoader 구현 클래스 의 집합 을 저장 합 니 다. 집합 데 이 터 는 다음 과 같 습 니 다.
    (1) com.bumptech.glide.load.model.stream.HttpUriLoader
    (2) com.bumptech.glide.load.model.AssetUriLoader
    (3) com.bumptech.glide.load.model.stream.MediaStoreImageThumbLoader
    (4) com.bumptech.glide.load.model.stream.MediaStoreVideoThumbLoader
    (5) com.bumptech.glide.load.model.UriLoader
    (6) com.bumptech.glide.load.model.UrlUriLoader

    5. 마찬가지 로 StringLoader. FileDescriptor Factory \ # build (MultiModelLoader Factory) 에서 MultiModelLoader Factory. build (Uri. class, Parcel FileDescriptor. class) 를 호출 했 습 니 다. 그러면 ModelLoader Registry 데이터 집합 에서 Entry 의 첫 번 째 전 파 는 Uri 이 고 두 번 째 전 파 는 Parcel FileDescriptor 의 데이터 항목 입 니 다. 조건 에 맞 는 것 은 다음 과 같 습 니 다.
    15. new MultiModelLoaderFactory.Entry(Uri.class, ParcelFileDescriptor.class, new AssetUriLoader.FileDescriptorFactory(context.getAssets()))
    19. new MultiModelLoaderFactory.Entry(Uri.class, ParcelFileDescriptor.class, new UriLoader.FileDescriptorFactory(context.getContentResolver()))

    6. 위 에서 알 수 있 듯 이 하나의 MultiModelLoader 로 ModelLoader 구현 클래스 의 집합 을 저장 합 니 다. 집합 데 이 터 는 다음 과 같 습 니 다.
    (1) com.bumptech.glide.load.model.AssetUriLoader
    (2) com.bumptech.glide.load.model.UriLoader

    7. 이렇게 되면 이 방법 은 두 개의 MultiModelLoader 를 포함 한 집합 항목 을 되 돌려 줍 니 다.
    getSourceEncoder
    원 격 자원 을 데이터 흐름 (InputStream) 으로 디 코딩 한 후 이 방법 을 호출 하면 Encoder Registry 의 데이터 집합 에서 Entry 의 첫 번 째 입력 Stream. class 로 전 송 된 데이터 항목 을 찾 아 위의 데이터 집합 을 통 해 알 수 있 듯 이 조건 에 맞 는 것 은
    2. new EncoderRegistry.Entry(InputStream.class, new StreamEncoder(arrayPool))

    StreamEncoder 대상 은 이 방법의 반환 항목 이다.
    getLoadPath
    이 방법 은 캐 시 파일 의 ByteBuffer 를 가 져 올 때 LoadPath 대상 을 되 돌려 야 합 니 다.
    getLoadPath(ByteBuffer.class, Object.class, Drawable.class)

    그 중에서 두 번 째 인 자 는 com. bumptech. glide. request. BaseRequestOptions \ # resourceClass 에 달 려 있 고 기본적으로 Object 입 니 다.세 번 째 매개 변 수 는 com. bumptech. glide. RequestManager \ # as (Class) 의 전 참 에 달 려 있 으 며, 주동 적 으로 설정 되 지 않 은 상태 에서 기본적으로 다음 과 같은 실현 이 있 습 니 다.
    package com.bumptech.glide;
    
    ...
    
    public class RequestManager implements LifecycleListener {
    
        ...
    
        public RequestBuilder asDrawable() {
                return as(Drawable.class).transition(new DrawableTransitionOptions());
            }
        }
    
        public RequestBuilder load(@Nullable Object model) {
            return asDrawable().load(model);
        }
    
        ...
    
    }

    즉, 기본 세 번 째 매개 변 수 는 Drawable 형식 입 니 다. 반환 절 차 는 다음 과 같 습 니 다. 1. Resource Decoder Registry 데이터 집합 에서 Entry 제1 2 개의 전 삼 기 류 를 찾 아 각각 ByteBuffer 와 Object 의 데이터 항목 입 니 다. 위의 데이터 집합 을 통 해 알 수 있 듯 이 조건 에 부합 되 는 것 은 다음 과 같은 세 가지 가 있 습 니 다.
    +) new ResourceDecoderRegistry.Entry(ByteBuffer.class, GifDrawable.class, byteBufferGifDecoder)
    1. new ResourceDecoderRegistry.Entry(ByteBuffer.class, Bitmap.class, new ByteBufferBitmapDecoder(downsampler))
    4. new ResourceDecoderRegistry.Entry(ByteBuffer.class, BitmapDrawable.class, new BitmapDrawableDecoder<>(resources, bitmapPool, new ByteBufferBitmapDecoder(downsampler)))

    이 세 개의 Entry 의 두 번 째 매개 변 수 를 하나의 집합 으로 합 니 다 (구분 하기 위해 resource 집합 이 라 고 약칭)
    1. GifDrawable.class
    2. Bitmap.class
    3. BitmapDrawable.class

    2. 집합 에 있 는 항목 의 기본 클래스 가 Drawable (getLoadPath 의 세 번 째 매개 변수) 인지 순서대로 비교 하면 GifDrawable. class 와 BitmapDrawable. class 가 조건 을 만족 시 키 는 지 알 수 있 습 니 다. getLoadPath 의 세 번 째 매개 변 수 는 Drawable. class 입 니 다.3. Bitmap. class 가 조건 을 만족 시 키 지 못 하면 Transcoder Registry 데이터 에서 Entry 제1 2 개 전 삼 의 기본 클래스 를 찾 아 냈 습 니 다. 각각 Bitmap 와 Drawable 의 데이터 항목 입 니 다. 조건 에 부합 되 는 것 은 분명 한 것 이 있 습 니 다.
    1. new TranscoderRegistry.Entry(Bitmap.class, BitmapDrawable.class, new BitmapDrawableTranscoder(resources, bitmapPool))

    그러면 Entry 의 두 번 째 매개 변수 인 BitmapDrawable. class 를 저장 합 니 다. 즉, 두 번 째, 세 번 째 두 번 째 저장 소 집합 (구분 을 위해 transcode 집합 이 라 고 약칭) 은
    1.Drawable.class
    2.BitmapDrawable.class
    3.Drawable.class

    4. 첫 번 째 작업 을 반복 합 니 다. 두 번 째 전 삼 은 Object. class 가 아니 라 resource 집합 에 있 는 모든 항목 입 니 다. 이번 에는 resource Decoder Registry. Entry 의 세 번 째 매개 변수 에 대응 하 는 집합 을 수집 해 야 합 니 다. 그러면 집합 을 얻 기 어렵 지 않 습 니 다 (구분 하기 위해 decoder 집합 이 라 고 약칭).
    byteBufferGifDecoder
    new ByteBufferBitmapDecoder(downsampler)
    new BitmapDrawableDecoder<>(resources, bitmapPool, new ByteBufferBitmapDecoder(downsampler))

    5. Transcoder Registry 데이터 집합 에서 Entry 제1 2 개 전 삼 의 기본 클래스 를 찾 아 resource 집합 대상 과 transcode 집합 대상 의 데이터 항목 을 찾 습 니 다. 첫 번 째 전 삼 이 두 번 째 전 삼 의 기본 클래스 라면 UnitTranscoder 로 돌아 갑 니 다. 그렇지 않 으 면 Transcoder Registry. Entry 의 세 번 째 매개 변 수 를 되 돌려 줍 니 다. 그러면 해당 하 는 집합 입 니 다.(구분 하기 위해 transcoder 집합 이 라 고 약칭)
    UnitTranscoder
    new BitmapDrawableTranscoder(resources, bitmapPool)
    UnitTranscoder

    6. 그러면 위의 집합 에 따라 DecodePath 의 집합 을 만 듭 니 다 (구분 을 위해 decodePaths 라 고 약칭)
    1. new DecodePath(ByteBuffer, GifDrawable, Drawable, [ByteBufferGifDecoder], UnitTranscoder, exceptionListPool)
    2. new DecodePath(ByteBuffer, Bitmap, BitmapDrawable, [ByteBufferBitmapDecoder], BitmapDrawableTranscoder, exceptionListPool)
    3. new DecodePath(ByteBuffer, BitmapDrawable, Drawable, [BitmapDrawableDecoder], UnitTranscoder, exceptionListPool)

    7. 이제 반환 값 을 추출 할 수 있 습 니 다
    new LoadPath<>(ByteBuffer, Object, Drawable, decodePaths, exceptionListPool);

    getRewinder
    캐 시 파일 의 ByteBuffer 를 가 져 올 때 이 방법 을 사용 합 니 다.
    getRewinder(ByteBuffer.class)

    DataRewinder Registry 의 데이터 집중 에서 ByteBuffer 를 키 로 하 는 항목 을 찾 습 니 다. 어렵 지 않 습 니 다.
    *) class, new ByteBufferRewinder.Factory()>

    그리고 com. bumptech. glide. load. resource. bytes. ByteBuffer Rewinder. Factory \ # build (ByteBuffer) 를 실행 합 니 다. 그 실행 결 과 는 ByteBuffer Rewinder 의 인 스 턴 스 를 만 드 는 것 입 니 다. 원본 코드 는 다음 과 같 습 니 다.
    package com.bumptech.glide.load.resource.bytes;
    
    ...
    
    public class ByteBufferRewinder implements DataRewinder<ByteBuffer> {
        private final ByteBuffer buffer;
    
        public ByteBufferRewinder(ByteBuffer buffer) {
            this.buffer = buffer;
        }
    
        @Override
        public ByteBuffer rewindAndGet() throws IOException {
            buffer.position(0);
            return buffer;
        }
    
        @Override
        public void cleanup() {
            // Do nothing.
        }
    
        public static class Factory implements DataRewinder.Factory<ByteBuffer> {
    
            @Override
            public DataRewinder build(ByteBuffer data) {
                return new ByteBufferRewinder(data);
            }
    
            @Override
            public Class getDataClass() {
                return ByteBuffer.class;
            }
        }
    }

    이 반환 인 스 턴 스 는 이 방법의 반환 값 입 니 다.
    getResultEncoder
    com. bumptech. glide. load. resource. bitmap. BiteBufferBitmapDecoder \ # decode (ByteBuffer, int, int, Options) 를 통 해 리 소스 를 가 져 올 때 getResultEncoder 를 호출 하면 리 소스 엔 코더 레 지 스 트 리 데이터 집합 에서 Entry 의 첫 번 째 매개 변 수 를 Bitmap 의 데이터 항목 집합 으로 찾 아야 합 니 다.
    1. new ResourceEncoderRegistry.Entry(Bitmap.class, new BitmapEncoder())

    그러면 두 번 째 인자 인 new BitmapEncoder () 는 이 방법 이 되 돌려 주어 야 할 값 입 니 다.
    isResourceEncoderAvailable
    이 방법 은 getResultEncoder 의 반환 결과 가 비어 있 는 지 판단 하 는 것 입 니 다.

    좋은 웹페이지 즐겨찾기