Glide原理--生命週期綁定

Gilde 的使用

最基礎的使用

Glide.with(context).load(url).into(imageView)

with方法

Glide.with(context)
with 重載方法
with(android.app.Activity)
with(android.app.Fragment)
with(android.support.v4.app.Fragment)
with(android.support.v4.app.FragmentActivity)
with(android.view)

with 方法返回的都是一個RequestManager對象,RequestManager 是管理請求的

@NonNull
  public static RequestManager with(@NonNull Activity activity) {
    return getRetriever(activity).get(activity);
  }

get 方法 根據不同的context 返回不同的RequestManager

public RequestManager get(Context context) {
    if (context == null) {
        throw new IllegalArgumentException("You cannot start a load on a null Context");
    } else if (Util.isOnMainThread() && !(context instanceof Application)) {
        if (context instanceof FragmentActivity) {
            return get((FragmentActivity) context);
        } else if (context instanceof Activity) {
            return get((Activity) context);
        } else if (context instanceof ContextWrapper) {
            return get(((ContextWrapper) context).getBaseContext());
        }
    }

    return getApplicationManager(context);
}

如果context是activity ,繼續看

public RequestManager get(@NonNull Activity activity) {
  if (Util.isOnBackgroundThread()) {
    // 如果不是主線程,則context對象轉爲ApplicationContext,然後也不做綁定生命週期的操作,
    // 圖片加載的生命週期默認爲Application的生命週期
    return get(activity.getApplicationContext());
  } else {
    assertNotDestroyed(activity);
    //(1)
    android.app.FragmentManager fm = activity.getFragmentManager();
    return fragmentGet(activity, fm, null /*parentHint*/);
  }
}
  • (1)處通過activity 獲取了FragmentManager 並傳給了fragmentGet方法
    fragmentGet 方法
private RequestManager fragmentGet(@NonNull Context context,
    @NonNull android.app.FragmentManager fm,
    @Nullable android.app.Fragment parentHint) {
    //(1)
  RequestManagerFragment current = getRequestManagerFragment(fm, parentHint);
  RequestManager requestManager = current.getRequestManager();
  ......
  return requestManager;
}
  • (1)處 獲取到一個無UI的Fragment,用來綁定Activity從而實現生命週期同步
創建Fragment 的原因
  • 因爲glide無法直接獲取activity的生命週期,通過activity的FragmentManager中加入一個隱藏的fragment,因爲fragment與傳入的activity生命週期一致,所以只要監聽這個RequestManagerFragment就能實現生命週期管理

接下來 getRequestManagerFragment 創建fragment

RequestManagerFragment getRequestManagerFragment(
    @NonNull final android.app.FragmentManager fm, @Nullable android.app.Fragment parentHint) {
//(1)
  RequestManagerFragment current = (RequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG);
  //(2)
  if (current == null) {
    current = pendingRequestManagerFragments.get(fm);
    if (current == null) {//(3)
      current = new RequestManagerFragment();
      ......
    }
  }
  return current;
} 
  • (1)處 這個Fragment是個無UI的Fragment,可以通過findFragmentByTag(FRAGMENT_TAG)去查找這個RequestManagerFragment
  • (2)處 如果第一次進來,current就是null,如果已經創建過,可以通過fm對象找到已有的fragment對象,如果再沒有(3)就創建一個RequestManagerFragment

接下來RequestManagerFragment 的構造方法

public class SupportRequestManagerFragment extends Fragment {
  
  public SupportRequestManagerFragment() {
   //(1)
    this(new ActivityFragmentLifecycle());
  }

  @SuppressLint("ValidFragment")
  public SupportRequestManagerFragment(ActivityFragmentLifecycle lifecycle) {
    //(2)
    this.lifecycle = lifecycle;
  }

  ActivityFragmentLifecycle getGlideLifecycle() {
    return lifecycle;
  }

  @Override
  public void onStart() {
    super.onStart();
    lifecycle.onStart();//(3)
  }

  @Override
  public void onStop() {
    super.onStop();
    lifecycle.onStop();//(4)
  }

  @Override
  public void onDestroy() {
    super.onDestroy();
    lifecycle.onDestroy();//(5)
  }
}
  • (1)處 初始化Fragment的時候也順便初始化了ActivityFragmentLifecycle
  • (2)處 lifecycle賦值 ActivityFragmentLifecycle
  • (3)(4)(5) 處都是fragement 生命週期的回調方法,在生命週期方法中調用ActivityFragmentLifecycle 的生命週期方法

看下ActivityFragmentLifecycle

class ActivityFragmentLifecycle implements Lifecycle {
  
  @Override
  public void addListener(LifecycleListener listener) {
    lifecycleListeners.add(listener);

    if (isDestroyed) {
      listener.onDestroy();
    } else if (isStarted) {
      listener.onStart();
    } else {
      listener.onStop();
    }
  }

  @Override
  public void removeListener(LifecycleListener listener) {
    lifecycleListeners.remove(listener);
  }

  void onStart() {
    isStarted = true;
    for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
      lifecycleListener.onStart();
    }
  }

  void onStop() {
    isStarted = false;
    for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
      lifecycleListener.onStop();
    }
  }

  void onDestroy() {
    isDestroyed = true;
    for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
      lifecycleListener.onDestroy();
    }
  }
}

public interface Lifecycle {
  void addListener(LifecycleListener listener);
  void removeListener(LifecycleListener listener);
}
  • ActivityFragmentLifecycle 實現了Lifecycle
  • 對外暴露一個addListener方法,可以監聽生命週期的變化
  • ActivityFragmentLifecycle 中的生命週期方法又調用了傳遞進來的lifecycleListener 的生命週期方法

看下哪裏調用了addListener ,在開始的fragmentGet中

private RequestManager fragmentGet(@NonNull Context context,
    @NonNull android.app.FragmentManager fm,
    @Nullable android.app.Fragment parentHint) {
  RequestManagerFragment current = getRequestManagerFragment(fm, parentHint);
  RequestManager requestManager = current.getRequestManager();
  if (requestManager == null) {
    Glide glide = Glide.get(context);
    //(1)
    requestManager = factory.build(
            glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);
    current.setRequestManager(requestManager);
  }
  return requestManager;
}
  • (1) 處 傳入的current.getGlideLifecycle() 就是Lifecycle ,而lifecycle正是ActivityFragmentLifecycle。

RequestManagerFactory

public interface RequestManagerFactory {
  @NonNull
  RequestManager build(
      @NonNull Glide glide,
      @NonNull Lifecycle lifecycle,
      @NonNull RequestManagerTreeNode requestManagerTreeNode,
      @NonNull Context context);
}

private static final RequestManagerFactory DEFAULT_FACTORY = new RequestManagerFactory() {
  @NonNull
  @Override
  public RequestManager build(@NonNull Glide glide, @NonNull Lifecycle lifecycle,
      @NonNull RequestManagerTreeNode requestManagerTreeNode, @NonNull Context context) {
    // (1)
    return new RequestManager(glide, lifecycle, requestManagerTreeNode, context);
  }
};
  • (1) 處 初始化了RequestManager

看下 RequestManager

public class RequestManager implements LifecycleListener {

  RequestManager(
      Glide glide,
      Lifecycle lifecycle,
      RequestManagerTreeNode treeNode,
      RequestTracker requestTracker,
      ConnectivityMonitorFactory factory,
      Context context) {

    this.glide = glide;
    this.lifecycle = lifecycle;
    this.treeNode = treeNode;
    this.requestTracker = requestTracker;
    this.context = context;

    if (Util.isOnBackgroundThread()) {
      mainHandler.post(addSelfToLifecycle);
    } else {
      // (1)
      lifecycle.addListener(this);
    }
  }
  ...
  @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);
  }
}
  • (1)處 調用lifecycle.addListener(this); 實現了與RequestManagerFragment生命週期的綁定

類之間關係圖:

在這裏插入圖片描述

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