Glide之生命周期管理

本文探讨了Glide在Android中的生命周期管理,分析了当传入ApplicationContext、Activity、FragmentActivity、Fragment或View时Glide如何自动管理其生命周期。通过源码解析,展示了如何通过创建无形的Fragment来跟随上下文的生命周期,确保图片加载的正确性和效率。
摘要由CSDN通过智能技术生成

 关于Glide的生命周期设计是Glide的一个很大亮点,现在就来看一下Glide生命周期的实现。
 在Glide源码解析这篇文章中就说过在Glide.with(context)中就实现了生命周期管理,with根据传入的参数有不同的实现。

  //传入一个Context
  public static RequestManager with(@NonNull Context context)
  //传入一个activity
  public static RequestManager with(@NonNull Activity activity)
  //传入一个FragmentActivity 
  public static RequestManager with(@NonNull FragmentActivity activity)
  //传入一个Fragment
  public static RequestManager with(@NonNull Fragment fragment)
  //传入一个View
  public static RequestManager with(@NonNull View view)

 虽然有这么多类型,但其实可以分为两类的。

  • 传入一个ApplicationContext,Glide的生命周期就相当于绑定了整个应用,只要应用不退出,任何时候都能够加载,也可以理解为不对Glide生命周期进行管理。
  • 传入activity、FragmentActivity 、Fragment 及View ,这样就会创建一个看不见的fragment,Glide的生命周期就随着该Fragment的变化而变化。

 当传入参数为ApplicationContext时,代码实现如下。

  public static RequestManager with(@NonNull Context context) {
   
    return getRetriever(context).get(context);
  }
  //由于传入参数是ApplicationContext,所以最终调用getApplicationManager方法。
  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) {
   
        //判断context类型是不是FragmentActivity
        return get((FragmentActivity) context);
      } else if (context instanceof Activity) {
   
        //判断context类型是不是Activity
        return get((Activity) context);
      } else if (context instanceof ContextWrapper) {
   
        //判断context类型是不是ContextWrapper
        return get(((ContextWrapper) context).getBaseContext());
      }
    }
    //context类型属于ApplicationContext
    return getApplicationManager(context);
  }

 由于传入参数是ApplicationContext,所以最终调用getApplicationManager方法。

  private RequestManager getApplicationManager(@NonNull Context context) {
   
    // Either an application context or we're on a background thread.
    if (applicationManager == null) {
   
      synchronized (this) {
   
        if (applicationManager == null) {
   
          Glide glide = Glide.get(context.getApplicationContext());
          applicationManager =
              factory.build(
                  glide,
                  new 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值