掌握Glide(2) : 从源码看,Glide是如何关联生命周期的

本文详细分析了Glide如何关联生命周期,从with()方法、SupportRequestManagerFragment类和ActivityFragmentLifecycle类入手,揭示了Glide在不同场景下如何绑定生命周期,如在Activity和Fragment中的应用,以及对性能优化的建议。
摘要由CSDN通过智能技术生成

本文将从源码的角度,分析Glide是如何关联生命周期的。
如无特殊说明,源码版本均指:4.6.1

学习Glide是如何关联生命周期的,核心在于一个知识点:
fragment的生命周期,是与Activity生命周期对应的。

明白并牢记这一点可,以更好的理解本文。

一.生命周期绑定

我们先以继承AppCompatActivity(它的父类是FragmentActivity)为例分析。在第3部分,我们再进行拓展到一般情况。

Glide加载图片最基本的方式如下:

Glide.with(MainActivity.this).load(url).into(mImageView);

Glide生命周期绑定是从入口单例类Glide开始的,通过with()多个重载方法来实现对生命周期的绑定工作。

1. with()方法

这个方法有多个重载,可以传入ContextActivityFragmentView等,但是内部调用方法都是一样的,只是参数有所不同,这里以传入FragmentActivity为例。

代码片1
   @NonNull
    public static RequestManager with(@NonNull FragmentActivity activity) {
   
        return getRetriever(activity).get(activity);
    }

第4行代码中, getRetriever(activity) ,返回的是 RequestManagerRetriever

第4行代码 整体看,即看 RequestManagerRetriever.class中的get方法:

代码片2  #RequestManagerRetriever.class

@NonNull
  public RequestManager get(@NonNull FragmentActivity activity) {
   
    //如果是在子线程
    if (Util.isOnBackgroundThread()) {
        --->2部分会分析(2A)
      return get(activity.getApplicationContext());    
    } else {
   
      //如果是在主线程
      assertNotDestroyed(activity);
       //获取当前Activity的FragmentManager
      //用于后续将创建的Fragment绑定到activity
      FragmentManager fm = activity.getSupportFragmentManager();
      return supportFragmentGet(activity, fm, null /*parentHint*/);
    }
  }

那我们看一下supportFragmentGet方法:

代码片3   #RequestManagerRetriever.class

 @NonNull
  private RequestManager supportFragmentGet(@NonNull Context context, @NonNull FragmentManager fm,
      @Nullable Fragment parentHint) {
   
     
    //创建无UI的fragment(第2部分分析),并绑定到当前activity
    SupportRequestManagerFragment current = getSupportRequestManagerFragment(fm, parentHint); --->分析3A
    RequestManager requestManager = current.getRequestManager();
    if (requestManager == null) {
   
      // TODO(b/27524013): Factor out this Glide.get() call.
      Glide glide = Glide.get(context);
      //创建RequestManager,获取fragment的lifecycle,传入requestManager
      requestManager =
          factory.build(
              glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);
      current.setRequestManager(requestManager);
    }
    return requestManager;
  }

我们看一下3A(代码片3第8行)的SupportRequestManagerFragment 是如何获取的。进入getSupportRequestManagerFragment方法:

代码片4   #RequestManagerRetriever.class

// pendingSupportRequestManagerFragments是一个map集合
 @VisibleForTesting
  final Map<FragmentManager, SupportRequestManagerFragment> pendingSupportRequestManagerFragments =
      new HashMap<>();

 @NonNull
  SupportRequestManagerFragment getSupportRequestManagerFragment(
      @NonNull final FragmentManager fm, @Nullable Fragment parentHint) {
   
       //1、由FragmentManager通过tag获取fragment
    SupportRequestManagerFragment current =
        (SupportRequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG);
    if (current == null) {
   
      //2、从缓存集合中获取fragment的,map以fragmentManger为key,
      //以fragment为value进行存储
      current = pendingSupportRequestManagerFragments.get(fm);
      if (current == null) {
   
        //3、创建一个fragment实例
        current = new SupportRequestManagerFragment();
        current.setParentFragmentHint(parentHint);
        pendingSupportRequestManagerFragments.put(fm, current);
        fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss();
        handler.obtainMessage(ID_REMOVE_SUPPORT_FRAGMENT_MANAGER, fm).sendToTarget();  ---(3部分会分析)分析4A
      }
    }
    return current;
  }

小结:

1、创建无UIFragment,并绑定到当前activity
2、通过builder模式创建RequestManager,并且将fragmentlifecycle传入,这样FragmentRequestManager就建立了联系;
3、获取Fragment对象,先根据tag去找,如果没有从内存中查找,pendingSupportRequestManagerFragments是一个存储fragment实例的HashMap,再没有的话就new一个。

2. SupportRequestManagerFragment 类

我们看一下SupportRequestManagerFragment类具体是怎么样的?

代码片5    SupportRequestManagerFragment.class

public class SupportRequestManagerFragment extends Fragment {
   
 
  private final ActivityFragmentLifecycle lifecycle;
   //省略部分代码

  public SupportRequestManagerFragment() {
   
    this(new ActivityFragmentLifecycle());    
  }

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

  @NonNull
  ActivityFragmentLifecycle getGlideLifecycle() {
   
    return lifecycle;
  }

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

  @Override
  public void onStop(
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值