43. Glide核心源碼解析

with-空白fragment

Glide中with函數有很多的重載方法,可以傳入Context,Activity,FragmentActivity,v4.Fragment,android.app.Fragment,View等等,而這些參數的類型決定了Glide的作用域。這些作用域可以分爲Application作用域(從應用啓動到應用銷燬)和非Application作用域(從頁面啓動到頁面銷燬),針對非Application作用域,Glide會在with函數中創建出一個空白的fragment和當前頁面(如Activity)綁定,這樣以來就可以監聽到當前頁面的啓動和銷燬的一系列生命週期(Glide主要監聽onStart onStop onDestroy),從而做到在頁面啓動之後開啓圖片的加載,在頁面退出之後暫停圖片的加載,以及對活動緩存的一些列操作等等。

精確到代碼層面,Glide在with函數調用的時候會有兩個關鍵的類被創建出來,一個是上面提到的Fragment(如RequestManagerFragment),另一個就是ReqeustManager,專門負責生命週期的管理。在ReqeustManager創建的時候,會持有RequestManagerFragment中的lifecycle對象的引用,並將當前ReqeustManager註冊到RequestManagerFragment lifecycle的集合中,而RequestManagerFragment監聽到生命週期的回調之後就回通過遍歷lifecycle集合通知到每一個ReqeustManager,ReqeustManager就可以管理到Glide加載的生命週期了。

load

load函數的邏輯很簡單,他也有多種重載方法,見下圖


但是不管是哪種方法,執行的都是下面的代碼,通過RequestBuilder去load,而RequestBuilder中又有多種load的重載

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

最終調用到,所以load方法只是保存了資源的地址而已

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

into

未完,待續,,,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章