Glide如何自動管理生命周期

Glide管理生命周期還是很有想法的,這種思路值得我們?nèi)W(xué)習(xí)和應(yīng)用;

特點

1.不用我們自己手動去實現(xiàn)他的接口或者注冊;

實現(xiàn)原理

1.通過Fragment依附Activity來監(jiān)聽生命周期變化;
2.本身不關(guān)注上層FragmentActivity或者Activity實現(xiàn);
3.glide通過本身實例化一個Fragment,來添加到FragmentActivity或者Activity,這樣只要關(guān)注該Fragment就可以知道生命周期變化;
大概畫了一個時序圖

源碼分析

Glide.with()方法參數(shù)可以是Activity,FragmentActivity,Fragment等,我們這里與with(@NonNull Activity activity)來分析,其他的類似:

Glide.class

  @NonNull
  public static RequestManager with(@NonNull Activity activity) {
    return getRetriever(activity).get(activity);
  }
RequestManagerRetriever 獲得該對象,我們這里不去關(guān)心,你只要知道Glide對象實例化的時候會初始化;

RequestManagerRetriever.class

  @SuppressWarnings("deprecation")
  @NonNull
  public RequestManager get(@NonNull Activity activity) {
    if (Util.isOnBackgroundThread()) {ir
      return get(activity.getApplicationContext());
    } else {
      assertNotDestroyed(activity);
      //獲取FragmentManager
      android.app.FragmentManager fm = activity.getFragmentManager();
      //重點在這里
      return fragmentGet(
          activity, fm, /*parentHint=*/ null, isActivityVisible(activity));
    }
  }
  @SuppressWarnings({"deprecation", "DeprecatedIsStillUsed"})
  @Deprecated
  @NonNull
  private RequestManager fragmentGet(@NonNull Context context,
      @NonNull android.app.FragmentManager fm,
      @Nullable android.app.Fragment parentHint,
      boolean isParentVisible) {
    //得到我們自己的Fragment
    RequestManagerFragment current = getRequestManagerFragment(fm, parentHint, isParentVisible);
    RequestManager requestManager = current.getRequestManager();
    if (requestManager == null) {
      // TODO(b/27524013): Factor out this Glide.get() call.
      Glide glide = Glide.get(context);
      requestManager =
          factory.build(
              glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);
      current.setRequestManager(requestManager);
    }
    return requestManager;
  }

  @SuppressWarnings("deprecation")
  @NonNull
  private RequestManagerFragment getRequestManagerFragment(
      @NonNull final android.app.FragmentManager fm,
      @Nullable android.app.Fragment parentHint,
      boolean isParentVisible) {
    //獲取該FragmentManager是否已經(jīng)有RequestManagerFragment
    RequestManagerFragment current = (RequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG);
    if (current == null) {
      current = pendingRequestManagerFragments.get(fm);
      if (current == null) {
        current = new RequestManagerFragment();
        current.setParentFragmentHint(parentHint);
        if (isParentVisible) {
          current.getGlideLifecycle().onStart();
        }
        pendingRequestManagerFragments.put(fm, current);
      //添加到上下文,賦予該RequestManagerFragment生命周期
        fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss();
        //pendingRequestManagerFragments.remove(fm);
        handler.obtainMessage(ID_REMOVE_FRAGMENT_MANAGER, fm).sendToTarget();
      }
    }
    return current;
  }

到此Glide.with(Activity)該請求已經(jīng)和傳入的activity生命周期綁定;

最后返回一個RequestManager對象,該對象時間在RequestManagerRetriever.supportFragmentGet()方法構(gòu)造出來

  @NonNull
  private RequestManager supportFragmentGet(
      @NonNull Context context,
      @NonNull FragmentManager fm,
      @Nullable Fragment parentHint,
      boolean isParentVisible) {
    SupportRequestManagerFragment current =
        getSupportRequestManagerFragment(fm, parentHint, isParentVisible);
    RequestManager requestManager = current.getRequestManager();
    if (requestManager == null) {
      // TODO(b/27524013): Factor out this Glide.get() call.
      Glide glide = Glide.get(context);
      //這是就是給RequestManager構(gòu)造函數(shù)傳入?yún)?shù)
      requestManager =
          factory.build(
              glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);
      current.setRequestManager(requestManager);
    }
    return requestManager;
  }

RequestManager.class

前面都是add,最后移除在RequestManager.class

  @Override
  public void onDestroy() {
    targetTracker.onDestroy();
    for (Target<?> target : targetTracker.getAll()) {
      clear(target);
    }
    targetTracker.clear();
    requestTracker.clearRequests();
    lifecycle.removeListener(this);
    lifecycle.removeListener(connectivityMonitor);
    mainHandler.removeCallbacks(addSelfToLifecycle);
    glide.unregisterRequestManager(this);
  }

結(jié)束!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末徒坡,一起剝皮案震驚了整個濱河市墅诡,隨后出現(xiàn)的幾起案子畏铆,更是在濱河造成了極大的恐慌蜓谋,老刑警劉巖芦瘾,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異彪见,居然都是意外死亡鹿寻,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門邦危,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洋侨,“玉大人,你說我怎么就攤上這事倦蚪∠<幔” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵陵且,是天一觀的道長裁僧。 經(jīng)常有香客問我,道長滩报,這世上最難降的妖魔是什么锅知? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮脓钾,結(jié)果婚禮上售睹,老公的妹妹穿的比我還像新娘。我一直安慰自己可训,他們只是感情好昌妹,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布捶枢。 她就那樣靜靜地躺著,像睡著了一般飞崖。 火紅的嫁衣襯著肌膚如雪烂叔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天固歪,我揣著相機與錄音蒜鸡,去河邊找鬼。 笑死牢裳,一個胖子當(dāng)著我的面吹牛逢防,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蒲讯,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼忘朝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了判帮?” 一聲冷哼從身側(cè)響起局嘁,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晦墙,沒想到半個月后悦昵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡偎痛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年旱捧,在試婚紗的時候發(fā)現(xiàn)自己被綠了独郎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片踩麦。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖氓癌,靈堂內(nèi)的尸體忽然破棺而出谓谦,到底是詐尸還是另有隱情,我是刑警寧澤贪婉,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布反粥,位于F島的核電站,受9級特大地震影響疲迂,放射性物質(zhì)發(fā)生泄漏才顿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一尤蒿、第九天 我趴在偏房一處隱蔽的房頂上張望郑气。 院中可真熱鬧,春花似錦腰池、人聲如沸尾组。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽讳侨。三九已至呵萨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間跨跨,已是汗流浹背潮峦。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留勇婴,地道東北人跑杭。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像咆耿,于是被迫代替她去往敵國和親德谅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,178評論 25 707
  • Glide筆記 一萨螺、簡介 在泰國舉行的谷歌開發(fā)者論壇上窄做,谷歌為我們介紹了一個名叫Glide的圖片加載庫,作者是bu...
    AndroidMaster閱讀 3,907評論 0 27
  • 今天周三慰技,一整天沒課椭盏。這幾天情緒很不穩(wěn)定,心里似乎堵上了一塊大石吻商,又悶又重掏颊。 最近經(jīng)常想起小時候,想起老家的日子艾帐,...
    來安7閱讀 191評論 0 0
  • 每個月的那幾天乌叶,我才發(fā)現(xiàn)自己是一個柔弱的女生。 痛經(jīng)對于每個女生來說都是一種痛苦柒爸。在我記憶里每次來例假都痛到要死准浴。...
    小仙女泡泡閱讀 767評論 0 0
  • 1.你認為你的頭腦屬于你自己嗎? 2.你能控制自己的感情嗎捎稚? 有些情緒乐横,不能控制 3.你的動力是來自內(nèi)心世界還是外...
    曾曾的麻麻閱讀 601評論 0 0