Glide Request
Glide在加载图片的第一步既是初始化Glide实例
接着就会获取RequestManager,然后初始化一个RequestBuilder构建一个Request,
本文会对于Glide的RequestBuilder实例化过程做解析
begin
Glide的创建是在Glide.with内部进行的,通过with以后就能得到一个RequestManager
的实例化对象
RequestManager
关于RequestManager
公开的api如下
addDefaultRequestListener
为所有由该RequestManager构建的Request添加监听。
applyDefaultRequestOptions
对Request进行默认配置
as
进行RequestBuilder的实例化
1 2 3 4
| public <ResourceType> RequestBuilder<ResourceType> as( @NonNull Class<ResourceType> resourceClass) { return new RequestBuilder<>(glide, this, resourceClass, context); }
|
asXX
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public RequestBuilder<Bitmap> asBitmap() { return as(Bitmap.class).apply(DECODE_TYPE_BITMAP); }
public RequestBuilder<GifDrawable> asGif() { return as(GifDrawable.class).apply(DECODE_TYPE_GIF); }
public RequestBuilder<Drawable> asDrawable() { return as(Drawable.class); }
public RequestBuilder<File> asFile() { return as(File.class).apply(skipMemoryCacheOf(true)); }
public RequestBuilder<File> downloadOnly() { return as(File.class).apply(DOWNLOAD_ONLY_OPTIONS); }
|
setPauseAllRequestsOnTrimMemoryModerate
在内存不足时暂停所有的请求
clear
取消Glide任务加载
RequestBuilder
Request的配置是通过RequestBuilder进行的,他会承载一些Request的参数信息
addListener
listener
load
error
thumbnail
transition
fallback
override
placeholder
transform
centerCrop
……
Request是如何被创建的
Request的创建是由RequestManager开启
asXXX方法几乎是RequestBuilder创建的唯一途径
而asXXX底层又调用了as方法
Glide默认只支持Bitmap,Gif,File,Drawable类型的配置。

其中RequestBuilder的创建也很干脆
1 2 3 4
| public <ResourceType> RequestBuilder<ResourceType> as( @NonNull Class<ResourceType> resourceClass) { return new RequestBuilder<>(glide, this, resourceClass, context); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| protected RequestBuilder( @NonNull Glide glide, RequestManager requestManager, Class<TranscodeType> transcodeClass, Context context) { this.glide = glide; this.requestManager = requestManager; this.transcodeClass = transcodeClass; this.context = context; this.transitionOptions = requestManager.getDefaultTransitionOptions(transcodeClass); this.glideContext = glide.getGlideContext(); initRequestListeners(requestManager.getDefaultRequestListeners()); apply(requestManager.getDefaultRequestOptions()); }
|
Request是如何进行配置的
RequestBuilder使用了建筑者模式,无非就是进行大量参数的配置。
也就是成员变量的设置
1 2 3 4 5 6 7 8 9
| public RequestBuilder<TranscodeType> transition( @NonNull TransitionOptions<?, ? super TranscodeType> transitionOptions) { if (isAutoCloneEnabled()) { return clone().transition(transitionOptions); } this.transitionOptions = Preconditions.checkNotNull(transitionOptions); isDefaultTransitionOptionsSet = false; return selfOrThrowIfLocked(); }
|
1 2 3 4 5 6 7 8 9 10 11 12
| public T error(@DrawableRes int resourceId) { if (isAutoCloneEnabled) { return clone().error(resourceId); } this.errorId = resourceId; fields |= ERROR_ID;
this.errorPlaceholder = null; fields &= ~ERROR_PLACEHOLDER;
return selfOrThrowIfLocked(); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13
| public RequestBuilder<TranscodeType> addListener( @Nullable RequestListener<TranscodeType> requestListener) { if (isAutoCloneEnabled()) { return clone().addListener(requestListener); } if (requestListener != null) { if (this.requestListeners == null) { this.requestListeners = new ArrayList<>(); } this.requestListeners.add(requestListener); } return selfOrThrowIfLocked(); }
|
之后不再一一例举