glide溯源之生命周期管理

glide溯源系列文章   

      通过查看glide的源码,我们知道glide是通过传入的context的生命周期来管理资源请求的生命周期的,那么glide是如何一步步实现的呢?接下来我们来分析一下。

       首先,我们来看一下glide的用法

GlideApp
    .with(context)
    .load(url)
    .centerCrop()
    .placeholder(R.drawable.loading_spinner)
    .into(myImageView);

     通过上面使用代码,我们注意到是通过with方法把contex对象传进去的,那么我们来看一下with方法

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

    此处先获取了 RequestManagerRetriever 对象,然后通过get方法获取 RequestManager,看一下get方法的实现

@NonNull
  public RequestManager get(@NonNull 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);
  }

此处分了几种情况,我们注重分析activity的情况,非全局context的情况是类似的

public RequestManager get(@NonNull Activity activity) {
    if (Util.isOnBackgroundThread()) {
      return get(activity.getApplicationContext());
    } else {
      assertNotDestroyed(activity);
      android.app.FragmentManager fm = activity.getFragmentManager();
      return fragmentGet(
          activity, fm, /*parentHint=*/ null, isActivityVisible(activity));
    }
  }

private RequestManager fragmentGet(@NonNull Context context,
      @NonNull android.app.FragmentManager fm,
      @Nullable android.app.Fragment parentHint,
      boolean isParentVisible) {
    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;
  }

private RequestManagerFragment getRequestManagerFragment(
      @NonNull final android.app.FragmentManager fm,
      @Nullable android.app.Fragment parentHint,
      boolean isParentVisible) {
    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);
        fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss();
        handler.obtainMessage(ID_REMOVE_FRAGMENT_MANAGER, fm).sendToTarget();
      }
    }
    return current;
  }

    通过activity获取到了FragmentManager,通过FragmentManager获取到RequestManagerFragment,RequestManagerFragment继承自Fragment,生命周期依赖于context,而RequestManager的生命周期依赖于RequestManagerFragment。

          RequestManager是生命周期是如何依赖RequestManagerFragment,下面我们着重分析一下。

  在fragmentGet方法中,创建RequestManager时传进去一个生命周期参数RequestManagerFragment.getGlideLifecycler(),在RequestManager中,使用了该参数,lifecycle.addListener(this),RequestManager本身实现了LifecycleListener接口,而addListener方法实质是调用了ActivityFragmentLifecycle.addListener,RequestManagerFragment中持有一个ActivityFragmentLifecycle对象,而这个对象就是传入RequestManager中的lifecycle对象,由此生命周期的管理便关联上了,由context生命周期变化而引起RequestManager的生命周期变化过程如下:

     context -> RequestManagerFragment -> ActivityFragmentLifecycle -> LifecycleListener(即RequestManager)

    下面是上述过程中的关键代码

//RequestManagerFragment.java
public class RequestManagerFragment extends Fragment {

    private final ActivityFragmentLifecycle lifecycle;
    
    @Override
  public void onStart() {
    //context的生命周期会回调到此fragment,而此处回回调到ActivityFragmentLifecycle 的生命周期
    super.onStart();
    lifecycle.onStart();
  }

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

}
//ActivityFragmentLifecycle.java
class ActivityFragmentLifecycle implements Lifecycle {
    private final Set<LifecycleListener> lifecycleListeners =
      Collections.newSetFromMap(new WeakHashMap<LifecycleListener, Boolean>());
    
    @Override
  public void addListener(@NonNull LifecycleListener listener) {
    lifecycleListeners.add(listener);

    if (isDestroyed) {
      listener.onDestroy();
    } else if (isStarted) {
      listener.onStart();
    } else {
      listener.onStop();
    }
  }
void onStart() {
    //此处的lifecycleListener中包含了RequestManager,所以此处会回调到RequestManager的几个回调方法
    isStarted = true;
    for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
      lifecycleListener.onStart();
    }
  }

  void onStop() {
    isStarted = false;
    for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
      lifecycleListener.onStop();
    }
  }
}
//RequestManager.java
public class RequestManager implements LifecycleListener{
    //此处的lifecycle 即 ActivityFragmentLifecycle 
    final Lifecycle lifecycle;

    lifecycle.addListener(RequestManager.this);

    
  public void onStart() {
    //此处做请求的生命周期操作
    //resume所有请求
    resumeRequests();
    //resume所有View
    targetTracker.onStart();
  }
    
  public void onStop() {
    //stop所有请求
    pauseRequests();
    //stop所有view
    targetTracker.onStop();
  }
}

猜你喜欢

转载自blog.csdn.net/qq_23081779/article/details/82991708