Glide load(xxx)源碼分析

Glide.with(this).load(url).into(imageView);

Glide調用with()方法初始化成功后,會返回RequestManager的實例。

1、RequestManager類中有多個load()的重載方法


  public RequestBuilder<Drawable> load(@Nullable Bitmap bitmap) {
    return asDrawable().load(bitmap);
  }

  public RequestBuilder<Drawable> load(@Nullable Drawable drawable) {
    return asDrawable().load(drawable);
  }

  public RequestBuilder<Drawable> load(@Nullable String string) {
    return asDrawable().load(string);
  }


  public RequestBuilder<Drawable> load(@Nullable Uri uri) {
    return asDrawable().load(uri);
  }

  public RequestBuilder<Drawable> load(@Nullable File file) {
    return asDrawable().load(file);
  }

  public RequestBuilder<Drawable> load(@RawRes @DrawableRes @Nullable Integer resourceId) {
    return asDrawable().load(resourceId);
  }

  public RequestBuilder<Drawable> load(@Nullable URL url) {
    return asDrawable().load(url);
  }


  public RequestBuilder<Drawable> load(@Nullable byte[] model) {
    return asDrawable().load(model);
  }

  public RequestBuilder<Drawable> load(@Nullable Object model) {
    return asDrawable().load(model);
  }

2、asDrawable()

  @NonNull
  @CheckResult
  public RequestBuilder<Drawable> asDrawable() {
    return as(Drawable.class);
  }

 -->新建一個RequestBuilder
  @NonNull
  @CheckResult
  public <ResourceType> RequestBuilder<ResourceType> as(
      @NonNull Class<ResourceType> resourceClass) {
    return new RequestBuilder<>(glide, this, resourceClass, context);
  }


-->RequestBuilder的創建
public class RequestBuilder<TranscodeType> extends BaseRequestOptions<RequestBuilder<TranscodeType>>
    implements Cloneable,
    ModelTypes<RequestBuilder<TranscodeType>> {

  @Nullable private Object model;
  private final Context context;
  private final Glide glide;
  private final RequestManager requestManager;
  private final Class<TranscodeType> transcodeClass;
  private TransitionOptions<?, ? super TranscodeType> transitionOptions;//過渡動畫配置
  private final GlideContext glideContext;

  protected RequestBuilder(
      @NonNull Glide glide,
      RequestManager requestManager,
      Class<TranscodeType> transcodeClass,
      Context context) {
    this.glide = glide;
    this.requestManager = requestManager;
    this.transcodeClass = transcodeClass; //Drawable.class
    this.context = context;
    this.transitionOptions = requestManager.getDefaultTransitionOptions(transcodeClass);設置默認的過渡動畫
    this.glideContext = glide.getGlideContext();

    //設置RequestListener集合
    //用來給調用者監聽圖片的加載成功和失敗
    initRequestListeners(requestManager.getDefaultRequestListeners());

    //設置默認的請求配置,DefaultRequestOptions()只是一個new RequestOptions()
    apply(requestManager.getDefaultRequestOptions());
  }

}

RequestBuilder 用來構建請求,例如設置 RequestOption、縮略圖、過渡動畫、加載失敗占位圖等等。

3、asDrawable().load(xxx)

public class RequestBuilder {

  @NonNull
  private RequestBuilder<TranscodeType> loadGeneric(@Nullable Object model) {
    this.model = model;
    isModelSet = true;
    return this;
  }

}

RequestManager的多個load重載方法,最后都一定會調用到RequestBuilder的loadGeneric,loadGeneric方法是用來設置圖片資源的來源類型為String;這里有個Model的概念,指的是圖片數據來源,可以是本地的圖片鏈接,可以是url,可以drawable的資源id。

總結:load(xxx)方法實際上就是用來構建RequestBuilder實例,并且設置圖片資源的來源類型。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容