Android主流三方库源码分析:Glide,理解透彻

} else if (context instanceof ContextWrapper) {

return get(((ContextWrapper) context).getBaseContext());

}

}

// 否则直接将请求与ApplicationLifecycle关联

return getApplicationManager(context);

}

复制代码

这里总结一下,对于当前传入的context是application或当前线程是子线程时,请求的生命周期和ApplicationLifecycle关联,否则,context是FragmentActivity或Fragment时,在当前组件添加一个SupportFragment(SupportRequestManagerFragment),context是Activity时,在当前组件添加一个Fragment(RequestManagerFragment)。

6、GlideApp#with小结
1、初始化各式各样的配置信息(包括缓存,请求线程池,大小,图片格式等等)以及glide对象。
2、将glide请求和application/SupportFragment/Fragment的生命周期绑定在一块。
这里我们再回顾一下with方法的执行流程。

三、load(url)源码详解

1、GlideRequest(RequestManager)#load

return (GlideRequest) super.load(string);

return asDrawable().load(string);

// 1、asDrawable部分

return (GlideRequest) super.asDrawable();

return as(Drawable.class);

// 最终返回了一个GlideRequest(RequestManager的子类)

return new GlideRequest<>(glide, this, resourceClass, context);

// 2、load部分

return (GlideRequest) super.load(string);

return loadGeneric(string);

@NonNull

private RequestBuilder loadGeneric(@Nullable Object model) {

// model则为设置的url

this.model = model;

// 记录url已设置

isModelSet = true;

return this;

}

复制代码

可以看到,load这部分的源码很简单,就是给GlideRequest(RequestManager)设置了要请求的mode(url),并记录了url已设置的状态。

这里,我们再看看load方法的执行流程。

四、into(iv)源码详解

前方预警,真正复杂的地方开始了。

1、RequestBuilder.into

@NonNull

public ViewTarget<ImageView, TranscodeType> into(@NonNull ImageView view) {

Util.assertMainThread();

Preconditions.checkNotNull(view);

RequestOptions requestOptions = this.requestOptions;

if (!requestOptions.isTransformationSet()

&& requestOptions.isTransformationAllowed()

&& view.getScaleType() != null) {

// Clone in this method so that if we use this RequestBuilder to load into a View and then

// into a different target, we don’t retain the transformation applied based on the previous

// View’s scale type.

switch (view.getScaleType()) {

// 这个RequestOptions里保存了要设置的scaleType,Glide自身封装了CenterCrop、CenterInside、

// FitCenter、CenterInside四种规格。

case CENTER_CROP:

requestOptions = requestOptions.clone().optionalCenterCrop();

break;

case CENTER_INSIDE:

requestOptions = requestOptions.clone().optionalCenterInside() ;

break;

case FIT_CENTER:

case FIT_START:

case FIT_END:

requestOptions = requestOptions.clone().optionalFitCenter();

break;

case FIT_XY:

requestOptions = requestOptions.clone().optionalCenterInside() ;

break;

case CENTER:

case MATRIX:

default:

// Do nothing.

}

}

// 注意,这个transcodeClass是指的drawable或bitmap

return into(

glideContext.buildImageViewTarget(view, transcodeClass),

/targetListener=/ null,

requestOptions);

}

复制代码

2、GlideContext#buildImageViewTarget

return imageViewTargetFactory.buildTarget(imageView, transcodeClass);

复制代码

3、ImageViewTargetFactory#buildTarget

@NonNull

@SuppressWarnings(“unchecked”)

public ViewTarget<ImageView, Z> buildTarget(@NonNull ImageView view,

@NonNull Class clazz) {

// 返回展示Bimtap/Drawable资源的目标对象

if (Bitmap.class.equals(clazz)) {

return (ViewTarget<ImageView, Z>) new BitmapImageViewTarget(view);

} else if (Drawable.class.isAssignableFrom(clazz)) {

return (ViewTarget<ImageView, Z>) new DrawableImageViewTarget(view);

} else {

throw new IllegalArgumentException(

"Unhandled class: " + clazz + “, try .as*(Class).transcode(ResourceTranscoder)”);

}

}

复制代码

可以看到,Glide内部只维护了两种target,一种是BitmapImageViewTarget,另一种则是DrawableImageViewTarget,接下来继续深入。

4、RequestBuilder#into

private <Y extends Target> Y into(

@NonNull Y target,

@Nullable RequestListener targetListener,

@NonNull RequestOptions options) {

Util.assertMainThread();

Preconditions.checkNotNull(target);

if (!isModelSet) {

throw new IllegalArgumentException(“You must call #load() before calling #into()”);

}

options = options.autoClone();

// 分析1.建立请求

Request request = buildRequest(target, targetListener, options);

Request previous = target.getRequest();

if (request.isEquivalentTo(previous)

&& !isSkipMemoryCacheWithCompletePreviousReques t(options, previous)) {

request.recycle();

// If the request is completed, beginning again will ensure the result is re-delivered,

// triggering RequestListeners and Targets. If the request is failed, beginning again will

// restart the request, giving it another chance to co

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值