글 라 이 드 여행 - 레 지 스 트 리
42919 단어 glide
glide 는 구 글 이 추천 하 는 안 드 로 이 드 이미지 로 딩 프레임 워 크 로 우수한 캐 시 정책, Activity 의 라 이 프 사이클 계승, GIF 이미지 지원 등 이 잘 알려 진 곳 이다.다음은 glide 로 그림 을 불 러 오 는 호출 입 니 다.
private void loadImage() {
Glide.with(this)
.load("http://pic2.orsoon.com/2017/0118/20170118011032176.jpg")
.into(ivTest);
}
그렇다면 이 프레임 워 크 는 어떻게 실제 작 동 되 는 것 일 까? 나 는 '글 라 이 드 여행' 시리즈 블 로 그 를 통 해 가능 한 한 내 마음 을 상세 하 게 기록 할 것 이다."Glide 의 여행" 시리즈 글 모음:
Registry (com. bumptech. glide. Registry) 는 관리 임무 수행 대상 을 등록 하 는 관리 류 로 간단하게 이해 할 수 있다. Registry 는 하나의 공장 이 고 그 중에서 모든 등록 대상 은 하나의 공장 직원 이 며 임 무 를 배포 할 때 현재 임무 의 성격 에 따라 해당 직원 에 게 나 누 어 처리한다.
분류 하 다.
Registry 는 전체 glide 를 관리 하 는 데 필요 한 작업 수행 대상 으로 구체 적 으로 7 개의 등록 지점 으로 나 뉜 다.
등록 대상
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 는 다음 과 같은 인 터 페 이 스 를 제공 하여 등록 대상 에 대한 획득 을 제공 합 니 다.
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 의 반환 결과 가 비어 있 는 지 판단 하 는 것 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
오픈 데이터와 Glide로, PWA의 피난소 맵 만든 이야기Google 스프레드 시트 Y Combinator의 2019 동계 클래스를 받고 있는 Glide 파운더들은 일반 기업이 모바일 앱을 만드는 어려움을 통감하고 있다. 그래서 그들은 프로세스를 스프레드 시트에서 시작하여...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.