Glide生命周期的绑定&缓存实现分析

本文深入探讨Glide如何与Activity和Fragment绑定生命周期,以及其加载和缓存机制。通过分析RequestManagerRetriever和SupportRequestManagerFragment,阐述了如何实现生命周期关联。此外,详细讲解了Glide加载图片的顺序,包括活动资源、LRU内存缓存、资源类型和数据来源,并介绍了ModelLoader和HttpUrlFetcher在网络加载中的作用。最后讨论了内存活动资源和LRU缓存的管理策略。
摘要由CSDN通过智能技术生成

这一篇是在上一篇的基础上加深我们对glide的理解,如果您对glide还没有一个感性的认识建议看一下。

Glide的加载流程分析:https://blog.csdn.net/qq_35561554/article/details/100618455

这篇主要回答上篇文章的几个问题:

RequestManager如何与Activity&Fragment进行生命周期的绑定

由上一篇文章我们知道RequestManager实际上是由RequestManagerRetriever来进行获取的。当传入对象是Fragment时

@NonNull
  public RequestManager get(@NonNull Fragment fragment) {
    Preconditions.checkNotNull(fragment.getActivity(),
          "You cannot start a load on a fragment before it is attached or after it is destroyed");
    if (Util.isOnBackgroundThread()) {
      return get(fragment.getActivity().getApplicationContext());
    } else {
      FragmentManager fm = fragment.getChildFragmentManager();
      return supportFragmentGet(fragment.getActivity(), fm, fragment, fragment.isVisible());
    }
  }

supportFragmentGet方法:

@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 =
          factory.build(
              glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);
      current.setRequestManager(requestManager);
    }
    return requestManager;
  }

可以看到supportFragmentGet方法首先通过传入Fragment获取的FragmentManager来获取一个

SupportRequestManagerFragment对象,如果这个对象的RequestManager为空就创建一个,并且将它设置个这个SupportRequestManagerFragment。

接下来我们来看看SupportRequestManagerFragment是如何创建的

@NonNull
  private SupportRequestManagerFragment getSupportRequestManagerFragment(
      @NonNull final FragmentManager fm, @Nullable Fragment parentHint, boolean isParentVisible) {
    SupportRequestManagerFragment current =
        (SupportRequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG);
    if (current == null) {
      current = pendingSupportRequestManagerFragments.get(fm);
      if (current == null) {
        current = new SupportRequestManagerFragment();
        current.setParentFragmentHint(parentHint);
        if (isParentVisible) {
          current.getGlideLifecycle().onStart();
        }
        pendingSupportRequestManagerFragments.put(fm, current);
        fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss();
        handler.obtainMessage(ID_REMOVE_SUPPORT_FRAGMENT_MANAGER, fm).sendToTarget();
      }
    }
    return current;
  }

上面的代码的意思是:给当前的fragment添加一个tag为FRAGMENT_TAG并且空白透明的子fragment,并且根据这个空白透明fragmnet来对这个requestManager进行生命周期管理,这样fragment就和requestManager进行生命周期关联。

类似的当传入的对象是activity的时候就给它设置透明的fragment,将activity和requestmanager进行生命周期的关联。

glide的加载&缓存如何实现

我们知道Glide的正真开始处理图片加载相关开始于Engine的load方法。

图片的加载顺序是:

  1. 活动资源

  2. lru内存缓存

  3. 资源类型

  4. 数据来源

相关的分析直接注释在代码中:

public synchronized <R> LoadStatus load(
      GlideContext glideContext,
      Object model,
      Key signature,
      int width,
      int height,
      Class<?> resourceClass,
      Class<R> transcodeClass,
      Priority priority,
      DiskCacheStrategy diskCacheStrategy,
      Map<Class<?>, Transformation<?>> transformations,
      boolean isTransformationRequired,
      boolean isScaleOnlyOrNoTransform,
      Options options,
      boolean isMemoryCacheable,
      boolean useUnlimitedSourceExecutorPool,
      boolean useAnimationPool,
      boolean onlyRetrieveFromCache,
      ResourceCallback cb,
      Executor c
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值