Glide与Activity/Fragment生命周期的绑定

2,699 阅读4分钟

总述

这篇文章主要分析与Fragment生命周期的绑定,因为现在都是在Fragemnt里进行界面展示。之前在前两篇以及分析过Glide的加载过程和缓存的使用。这里就不进行分析了。

RequestManager关联Fragment生命周期

通过前面的文章,我们知道我们的请求的发起是在RequestManager中,即Glide.with(context).load(),那Glide我们Fragment周期的过程会暂停请求,或回复请求,肯定会跟他有关系。我们再次深入分析其构建过程

reqeustManager创建

这里以Glide.with(fragemnt)分析

  • 根据我们传入的fragemnt,创建requestmanagerRetriever
  • 然后去创建RequestManager
public static RequestManager with(@NonNull Fragment fragment) {
    return getRetriever(fragment.getActivity()).
    get(fragment);
  }

这里我们看到创建requestmanagerRetriever是跟activity相关的,其会获取fragment绑定的activity

  • 根据传入的fragment创建SupportRequestManagerFragment
  • 然后将SupportRequestManagerFragment的ActivityFragmentLifecycle设置给RequestManager
public RequestManager get(@NonNull Fragment fragment) {
    Preconditions.checkNotNull(fragment.getActivity(),
    //如果在后台线程,则使用的时,applicationContext
    if (Util.isOnBackgroundThread()) {
      return get(fragment.getActivity().getApplicationContext());
    } else {
     //拿到传入的fragment的fragmentManager
      FragmentManager fm = fragment.getChildFragmentManager();
      return supportFragmentGet(fragment.getActivity(), fm, fragment, fragment.isVisible());
    }
  }

private RequestManager supportFragmentGet(
      @NonNull Context context,
      @NonNull FragmentManager fm,
      @Nullable Fragment parentHint,
      boolean isParentVisible) {
      //创建SupportRequestManagerFragment
    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
      // 将创建的SupportRequestManagerFragment的
      //ActivityFragmentLifecycle 传递给requestManager
      requestManager =
          factory.build(
              glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);
      current.setRequestManager(requestManager);
    }
    return requestManager;
  }

总结

  • 发现在requestmanager的创建过程其会首先生成一个SupportRequestManagerFragment
  • 然后将SupportRequestManagerFragment与生命周期相关的ActivityFragmentLifecycle设置给RequestManager

SupportRequestManagerFragment

  • 给类为fragment的子类
  • 在其创建过程,将我们传递的fragment通过setParentFragmentHint 设置给它
private SupportRequestManagerFragment getSupportRequestManagerFragment(
      @NonNull final FragmentManager fm, @Nullable Fragment parentHint, boolean isParentVisible) {
       ....
        current = new SupportRequestManagerFragment();
        current.setParentFragmentHint(parentHint);
        if (isParentVisible) {
          current.getGlideLifecycle().onStart();
        }
      .....
    }
    return current;
  }

  • setParentFragmentHint方法调用,将我们一开始传入的fragment作为创建的SupportRequestManagerFragment的父
void setParentFragmentHint(@Nullable Fragment parentFragmentHint) {
    this.parentFragmentHint = parentFragmentHint;
    if (parentFragmentHint != null && parentFragmentHint.getActivity() != null) {
      registerFragmentWithRoot(parentFragmentHint.getActivity());
    }
  }

  • 首先解绑之前注册的
  • 然后使用我们通过Glide.with(fragemnt)设置的fragment的activity去获取rootRequestManagerFragment
  • 判断与当前设置的是否一样
  • 不一样,将新建的SupportRequestManagerFragment加入rootRequestManagerFragment
private void registerFragmentWithRoot(@NonNull FragmentActivity activity) {
    unregisterFragmentWithRoot();
    rootRequestManagerFragment =
        Glide.get(activity).getRequestManagerRetriever().getSupportRequestManagerFragment(activity);
    if (!equals(rootRequestManagerFragment)) {
      rootRequestManagerFragment.addChildRequestManagerFragment(this);
    }
  }

  • 其重写了onAttach方法
public void onAttach(Context context) {
    super.onAttach(context);
    try {
      registerFragmentWithRoot(getActivity());
    } catch (IllegalStateException e) {
      // OnAttach can be called after the activity is destroyed, see #497.
      if (Log.isLoggable(TAG, Log.WARN)) {
        Log.w(TAG, "Unable to register fragment with root", e);
      }
    }
  }

这里第二次进行绑定传递的为fragment所属的activity,是为了绑定activity的生命周期,当activity的生命周期回调时,其所属的所有fragment进行回调

  • 这个RequestManagerFragment有可能是自身,有可能已经被初始化过了,比如是通过with(Activity activity)的方式初始化

ActivityFragmentLifecycle

  • 创建SupportRequestManagerFragment时,创建其
public SupportRequestManagerFragment() {
    this(new ActivityFragmentLifecycle());
  }
  • 其采用观察者设计模式
  • 在调用addLister时,首先,先调用其start方法
  • 后期在不同的生命周期,遍历注册的onserver,调用其响应的方法
public void addListener(@NonNull LifecycleListener listener) {
    lifecycleListeners.add(listener);

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

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

与fragment生命周期绑定

通过前面我们知道RequestManager在创建时,会设置SupportRequestManagerFragent的Lifecycle

  • RequestManager 继承LifecycleListener
  • requestManager构造方法中订阅LifeCycle
if (Util.isOnBackgroundThread()) {
      mainHandler.post(addSelfToLifecycle);
    } else {
      lifecycle.addListener(this);
    }
    lifecycle.addListener(connectivityMonitor);

生命周期方法调用

前面我们知道创建RequestManager时,会与SupportRequestManagerFragment的Lifecycle绑定,而SupportRequestManagerFragment持有我们调用Glide时设置的Fragemnt,以及该Fragemnt的Activity的SupportRequestManagerFragment

绑定Fragment生命周期

  • 在创建SupportRequestManagerFragment使用的fm为我们使用Glide.with(fragement)的childFragmentManager
FragmentManager fm = fragment.getChildFragmentManager();
      return supportFragmentGet(fragment.getActivity(), fm, fragment, fragment.isVisible());
  • 这样当我们fragment的生命周期调用时,会调用SupportRequestManagerFragment相应的生命周期,比如onStop
public void onStop() {
    super.onStop();
    lifecycle.onStop();
  }

调用lifecycle的生命周期方法

  • 然后lifecycle会调用所有注册的lifecyclelistener
  • 我们知道其就是requestmanager
void onStop() {
    isStarted = false;
    for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
      lifecycleListener.onStop();
    }
  }

调用requestmanager生命周期方法

  • 在onStop时,其会暂停请求
  */
  @Override
  public synchronized void onStop() {
    pauseRequests();
    targetTracker.onStop();
  }
public synchronized void pauseRequests() {
    requestTracker.pauseRequests();
  }

public void pauseRequests() {
    isPaused = true;
    for (Request request : Util.getSnapshot(requests)) {
      if (request.isRunning()) {
        request.clear();
        pendingRequests.add(request);
      }
    }
  }

到这里,Glide与Fragment的生命周期的关联已经很清晰了。但是创建SupportRequestManagerFragment时的parentFragent和rootRequestManagerFragment的作用是什么呢,他们做了什么,并没有看到?

  • 这个主要时用于处理递归时的情况,比如frament中又嵌套frament,例如一个Activity采用Viewpager + Fragment的形式,而里面的Fragment又是一个ViewPager + Fragment的形式
  • 我们在requestmanager会发现一个递归调用方法,会调用treeNode.getDescendants())
public synchronized void resumeRequestsRecursive() {
    Util.assertMainThread();
    resumeRequests();
    for (RequestManager requestManager : treeNode.getDescendants()) {
      requestManager.resumeRequests();
    }
  }
  • 然后在里面其会判断,拿到其下面的requestfragment
  • 在遍历过程,首先判断rootquestfragment是不是自己,如果是本身,返回childRequestFragments
  • 如果不是,则会遍历,遍历中会调用getParentFragmentUsingHint,判断是不是给fragment的子类
Set<SupportRequestManagerFragment> getDescendantRequestManagerFragments() {
    if (rootRequestManagerFragment == null) {
      return Collections.emptySet();
    } else if (equals(rootRequestManagerFragment)) {
      return Collections.unmodifiableSet(childRequestManagerFragments);
    } else {
      Set<SupportRequestManagerFragment> descendants = new HashSet<>();
      for (SupportRequestManagerFragment fragment : rootRequestManagerFragment
          .getDescendantRequestManagerFragments()) {
        if (isDescendant(fragment.getParentFragmentUsingHint())) {
          descendants.add(fragment);
        }
      }
      return Collections.unmodifiableSet(descendants);
    }
private Fragment getParentFragmentUsingHint() {
    Fragment fragment = getParentFragment();
    return fragment != null ? fragment : parentFragmentHint;
  }

总结

  • Glide的请求通过requestmanager管理
  • requestmanager创建时,会绑定一个requestfragment,该requestfragemnt为Glide.with(fragment)的儿子
  • 同时requestmanager会持有requestframent的lificycle
  • lificycle在构建requestfragment创建,为ActivityFragmentLifecycle
  • 然后在进行请求或构建requestmanager时,会调用lifecycle.addListener,将自己作为observer添加进去,本身重写LifecycleListeneronStart,onStop,onDestoy,暂停请求或回复请求