Glide4.11.0(一)

//load 過(guò)程
--> RequestBuilder load(String string)  @RequestManager
    --> asDrawable() @RequestManager
        --> new RequestBuilder<>(glide, this, resourceClass, context); @RequestManager
    --> load(@Nullable String string) @RequestBuilder
        -->  loadGeneric(string) @RequestBuilder

我們需要關(guān)心的 關(guān)鍵點(diǎn):

總結(jié)

  • 子線(xiàn)程,用的是Application 作用域,不會(huì)搞空白的 Fragment。
  • 主線(xiàn)程,非Application 作用域,通過(guò)空白的Fragment 監(jiān)聽(tīng)。
  • 每個(gè)Activity 對(duì)應(yīng)一個(gè) Fragment,然后對(duì)應(yīng)一個(gè) RequestManager。

app 包對(duì)應(yīng) RequestManagerFragment 空白 Fragment
v4 包對(duì)應(yīng) SupportRequestManagerFragment 空白 Fragment

Application 作用域?qū)?yīng) ApplicationLifecycle
非 Application 作用域?qū)?yīng) ActivityFragmentLifecycle

class ActivityFragmentLifecycle implements Lifecycle {
    //管理 LifecycleListener 監(jiān)聽(tīng)器,一個(gè)Activity 對(duì)應(yīng)一個(gè) LifecycleListener 
    private final Set<LifecycleListener> lifecycleListeners =
            Collections.newSetFromMap(new WeakHashMap<LifecycleListener, Boolean>());
    private boolean isStarted;
    private boolean isDestroyed;
}

Glide架構(gòu):(同學(xué)們這張圖片是網(wǎng)上的圖片而已,很模糊,有個(gè)大概的認(rèn)識(shí)就行)

一、with 源碼:

with時(shí)序圖:


Glide
- 主要做一些 init 工作,比如緩存,線(xiàn)程池,復(fù)用池的構(gòu)建等等。

RequestManagerRetriever 大管家
- 主要是獲得一個(gè) `RequestManager` 請(qǐng)求管理類(lèi),然后綁定一個(gè) Fragment 。

SupportRequestManagerFragment :
- 用于管理請(qǐng)求的生命周期。

RequestManager
- 主要用于對(duì)請(qǐng)求的管理封裝。
  • 第一步:調(diào)用 with,同學(xué)們可以看下 with 這個(gè)源碼函數(shù),重載有很多:
    Glide.java 類(lèi)
    @NonNull
    public static RequestManager with(@NonNull Context context) {
        return getRetriever(context).get(context);
    }

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

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

    @NonNull
    public static RequestManager with(@NonNull Fragment fragment) {
        return getRetriever(fragment.getActivity()).get(fragment);
    }

    @Deprecated
    @NonNull
    public static RequestManager with(@NonNull android.app.Fragment fragment) {
        return getRetriever(fragment.getActivity()).get(fragment);
    }

    @NonNull
    public static RequestManager with(@NonNull View view) {
        return getRetriever(view.getContext()).get(view);
    }

同學(xué)們上面其實(shí)常用的就 Activity,F(xiàn)ragment, Context 這 3 種形式,下面我們就以 Activity 為主

  • 第二步,getRetriever(activity):
    @NonNull
    private static RequestManagerRetriever getRetriever(@Nullable Context context) {
        Preconditions.checkNotNull(context, "You cannot start a load on a not yet attached View or xxx.");
        return get(context).getRequestManagerRetriever();
    }

RequestManagerRetriever 是大管家

同學(xué)們繼續(xù)看 get(context)

  public static Glide get(@NonNull Context context) {
    if (glide == null) {
      GeneratedAppGlideModule annotationGeneratedModule =
          getAnnotationGeneratedGlideModules(context.getApplicationContext());
      synchronized (Glide.class) {
        if (glide == null) {
          checkAndInitializeGlide(context, annotationGeneratedModule);
        }
      }
    }

    return glide;
  }

同學(xué)們上面的 Glide get(Context) 是一種雙重檢測(cè)單例模式(DCL),保證了多線(xiàn)程下安全,僅此而已,非常的簡(jiǎn)單:

checkAndInitializeGlide(...); 看看做了什么:

  private static void checkAndInitializeGlide(
      @NonNull Context context, @Nullable GeneratedAppGlideModule generatedAppGlideModule) {
    if (isInitializing) {
      throw new IllegalStateException(
          "You cannot call Glide.get() in registerComponents(),"
              + " use the provided Glide instance instead");
    }
    //是否初始化標(biāo)志
    isInitializing = true;
    //開(kāi)始進(jìn)行初始化
    initializeGlide(context, generatedAppGlideModule);
    isInitializing = false;
  }

同學(xué)們接著看 initializeGlide(...)

  private static void initializeGlide(
      @NonNull Context context, @Nullable GeneratedAppGlideModule generatedAppGlideModule) {
    //實(shí)例化一個(gè) GlideBuilder 在進(jìn)行初始化
    //GlideBuilder 默認(rèn)的一些配置信息
    initializeGlide(context, new GlideBuilder(), generatedAppGlideModule);
  }

再接著看initializeGlide

    private static void initializeGlide(@NonNull Context context, @NonNull GlideBuilder builder, GeneratedAppGlideModule annotationGeneratedModule) {

        //1. 拿到應(yīng)用級(jí)別的上下文,這里可以避免內(nèi)存泄漏,我們實(shí)際開(kāi)發(fā)也可以通過(guò)這種形式拿上下文。
        Context applicationContext = context.getApplicationContext();
        //2. 這里拿到 @GlideModule 標(biāo)識(shí)的注解處理器生成的 GeneratedAppGlideModuleImpl、
      //GeneratedAppGlideModuleFactory ...等等。                          
        GeneratedAppGlideModule annotationGeneratedModule = getAnnotationGeneratedGlideModules();

      .....

        //3. 通過(guò)注解生成的代碼拿到 RequestManagerFactory
        RequestManagerFactory factory = annotationGeneratedModule != null ? annotationGeneratedModule.getRequestManagerFactory() : null;                               
        //4. 將拿到的工廠添加到 GlideBuilder 
        builder.setRequestManagerFactory(factory);
       
      ....

        //5. 這里通過(guò) Builder 建造者模式,構(gòu)建出 Glide 實(shí)例對(duì)象
        Glide glide = builder.build(applicationContext);

        //6. 開(kāi)始注冊(cè)組件回調(diào)
        for (com.bumptech.glide.module.GlideModule module : manifestModules) {
            try {
              module.registerComponents(applicationContext, glide, glide.registry);
            } catch (AbstractMethodError e) {
              throw new IllegalStateException(
            "Attempting to register a Glide v3 module. If you see this, you or one of your"
                + " dependencies may be including Glide v3 even though you're using Glide v4."
                + " You'll need to find and remove (or update) the offending dependency."
                + " The v3 module name is: "
                + module.getClass().getName(),
            e);
            }
        }

        if (annotationGeneratedModule != null) {
           annotationGeneratedModule.registerComponents(applicationContext, glide, glide.registry);
        }
                
        applicationContext.registerComponentCallbacks(glide);
        //將構(gòu)建出來(lái)的 glide 賦值給 Glide 的靜態(tài)變量
        Glide.glide = glide;
    }

通過(guò)上面的注釋?zhuān)嘈磐瑢W(xué)們很容易理解,注意看注釋 5 ,這里知道是通過(guò)建造者生成的,那么具體內(nèi)部怎么實(shí)現(xiàn)的,接著看:

package com.bumptech.glide;

public final class GlideBuilder {

  //管理線(xiàn)程池
  private Engine engine;
  //對(duì)象池(享元模式),這樣做避免重復(fù)創(chuàng)建對(duì)象,對(duì)內(nèi)存開(kāi)銷(xiāo)有一定效果
  private BitmapPool bitmapPool;
  private ArrayPool arrayPool;
 
  //GlideExecutor 線(xiàn)程池
  private GlideExecutor sourceExecutor;
  private GlideExecutor diskCacheExecutor;
  //本地磁盤(pán)緩存
  private DiskCache.Factory diskCacheFactory;
  //內(nèi)存緩存
  private MemorySizeCalculator memorySizeCalculator;
  private MemoryCache memoryCache;
  private ConnectivityMonitorFactory connectivityMonitorFactory;
  private int logLevel = Log.INFO;
  private RequestOptions defaultRequestOptions = new RequestOptions();
  @Nullable
  private RequestManagerFactory requestManagerFactory;
  private GlideExecutor animationExecutor;
  private boolean isActiveResourceRetentionAllowed;
  @Nullable
  private List<RequestListener<Object>> defaultRequestListeners;
  private boolean isLoggingRequestOriginsEnabled;

  //都是一些配置信息,用到了 開(kāi)閉原則。
    ....

  //開(kāi)始構(gòu)建,同學(xué)們注意:重點(diǎn)留意我寫(xiě)的注釋
  @NonNull
  Glide build(@NonNull Context context) {
    //實(shí)例化一個(gè)網(wǎng)絡(luò)請(qǐng)求的線(xiàn)程池
    if (sourceExecutor == null) {
      sourceExecutor = GlideExecutor.newSourceExecutor();
    }
    //實(shí)例化一個(gè)本地磁盤(pán)緩存的線(xiàn)程池
    if (diskCacheExecutor == null) {
      diskCacheExecutor = GlideExecutor.newDiskCacheExecutor();
    }
     //實(shí)例化一個(gè)加載圖片動(dòng)畫(huà)的一個(gè)線(xiàn)程池
    if (animationExecutor == null) {
      animationExecutor = GlideExecutor.newAnimationExecutor();
    }
    //實(shí)例化一個(gè)對(duì)圖片加載到內(nèi)存的一個(gè)計(jì)算
    if (memorySizeCalculator == null) {
      memorySizeCalculator = new MemorySizeCalculator.Builder(context).build();
    }
    //實(shí)例化一個(gè)默認(rèn)網(wǎng)絡(luò)連接監(jiān)控的工廠
    if (connectivityMonitorFactory == null) {
      connectivityMonitorFactory = new DefaultConnectivityMonitorFactory();
    }
        
    //實(shí)例化一個(gè) Bitmap 對(duì)象池
    if (bitmapPool == null) {
      int size = memorySizeCalculator.getBitmapPoolSize();
      //如果池子里還有可用的,直接加入 最近最少使用的 LruBitmap 容器里
      if (size > 0) {
        bitmapPool = new LruBitmapPool(size);
      } else {
        //如果池子已經(jīng)滿(mǎn)了,那么就裝在 BitmapPoolAdapter
        bitmapPool = new BitmapPoolAdapter();
      }
    }

    //實(shí)例化一個(gè)數(shù)組對(duì)象池
    if (arrayPool == null) {
      arrayPool = new LruArrayPool(memorySizeCalculator.getArrayPoolSizeInBytes());
    }
        
    //資源內(nèi)存緩存
    if (memoryCache == null) {
      memoryCache = new LruResourceCache(memorySizeCalculator.getMemoryCacheSize());
    }
    //磁盤(pán)緩存的工廠
    if (diskCacheFactory == null) {
      diskCacheFactory = new InternalCacheDiskCacheFactory(context);
    }
        
    //構(gòu)建執(zhí)行緩存策略跟線(xiàn)程池的引擎
    if (engine == null) {
      engine =
          new Engine(
              memoryCache,
              diskCacheFactory,
              diskCacheExecutor,
              sourceExecutor,
              GlideExecutor.newUnlimitedSourceExecutor(),
              GlideExecutor.newAnimationExecutor(),
              isActiveResourceRetentionAllowed);
    }

    if (defaultRequestListeners == null) {
      defaultRequestListeners = Collections.emptyList();
    } else {
      defaultRequestListeners = Collections.unmodifiableList(defaultRequestListeners);
    }
    //實(shí)例化一個(gè) RequestManagerRetriever 請(qǐng)求管理類(lèi)
    RequestManagerRetriever requestManagerRetriever =
        new RequestManagerRetriever(requestManagerFactory);

    //實(shí)例化 Glide 的地方
    return new Glide(
        context,
        engine,
        memoryCache,
        bitmapPool,
        arrayPool,
        requestManagerRetriever,
        connectivityMonitorFactory,
        logLevel,
        defaultRequestOptions.lock(),
        defaultTransitionOptions,
        defaultRequestListeners,
        isLoggingRequestOriginsEnabled);
  }
}

同學(xué)們上面的代碼中,builder 主要構(gòu)建線(xiàn)程池復(fù)用池、緩存策略、執(zhí)行 Engine ,最后構(gòu)建 Glide 實(shí)例,我們看看 Glide 怎么實(shí)例化的,主要看對(duì)應(yīng)的構(gòu)造函數(shù)就行了。

Glide(
      @NonNull Context context,
      @NonNull Engine engine,
      @NonNull MemoryCache memoryCache,
      @NonNull BitmapPool bitmapPool,
      @NonNull ArrayPool arrayPool,
      @NonNull RequestManagerRetriever requestManagerRetriever,
      @NonNull ConnectivityMonitorFactory connectivityMonitorFactory,
      int logLevel,
      @NonNull RequestOptions defaultRequestOptions,
      @NonNull Map<Class<?>, TransitionOptions<?, ?>> defaultTransitionOptions,
      @NonNull List<RequestListener<Object>> defaultRequestListeners,
      boolean isLoggingRequestOriginsEnabled) {
    //將 Builder 構(gòu)建的線(xiàn)程池,對(duì)象池,緩存池保存到 Glide 中
    this.engine = engine;
    this.bitmapPool = bitmapPool;
    this.arrayPool = arrayPool;
    this.memoryCache = memoryCache;
    this.requestManagerRetriever = requestManagerRetriever;
    this.connectivityMonitorFactory = connectivityMonitorFactory;
        
    //拿到 Glide 對(duì)應(yīng)需要的編解碼
    DecodeFormat decodeFormat = defaultRequestOptions.getOptions().get(Downsampler.DECODE_FORMAT);
    bitmapPreFiller = new BitmapPreFiller(memoryCache, bitmapPool, decodeFormat);

    final Resources resources = context.getResources();

    registry = new Registry();
    registry.register(new DefaultImageHeaderParser());
    
    //忽略一些配置信息
    ...
    //用于顯示對(duì)應(yīng)圖片的工廠
    ImageViewTargetFactory imageViewTargetFactory = new ImageViewTargetFactory();
  
    //構(gòu)建一個(gè) Glide 專(zhuān)屬的 上下文
    glideContext =
        new GlideContext(
            context,
            arrayPool,
            registry,
            imageViewTargetFactory,
            defaultRequestOptions,
            defaultTransitionOptions,
            defaultRequestListeners,
            engine,
            isLoggingRequestOriginsEnabled,
            logLevel);
  }

同學(xué)們會(huì)發(fā)現(xiàn),上面有一個(gè) GlideContentx 這個(gè)是什么鬼? 其實(shí)就是 Context一個(gè)級(jí)別的上下文而已,你看呀

public class GlideContext extends ContextWrapper{ }

同學(xué)們到這里我們已經(jīng)知道了 緩存策略、Glide、GlideContext 怎么構(gòu)建出來(lái)的了,下面我們看怎么拿到 請(qǐng)求管理類(lèi) RequestManager

getRetriever(activity).get(activity); 最終是返回 RequestManager:
這里的 get 也有很多重載的函數(shù),同學(xué)們只需要看 Activity 參數(shù)的重載:

  • RequestManagerRetriever.java類(lèi)
public class RequestManagerRetriever implements Handler.Callback {
  @NonNull
  public RequestManager get(@NonNull Context context) {
   if (context == null) {
      throw new IllegalArgumentException("You cannot start a load on a null Context");
     //如果在主線(xiàn)程中并且不為 Application 級(jí)別的 Context 執(zhí)行
    } 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) {
        //一直到查找 BaseContext
        return get(((ContextWrapper) context).getBaseContext());
      }
    }
    //如果不在主線(xiàn)程中或?yàn)?Application 就直接執(zhí)行
    return getApplicationManager(context);
  }


  private RequestManager getApplicationManager(@NonNull Context context) {
    //application 作用域,用 ApplicationLifecycle 監(jiān)聽(tīng)
    if (applicationManager == null) {
      synchronized (this) {
        if (applicationManager == null) {
          Glide glide = Glide.get(context.getApplicationContext());
          applicationManager =
              factory.build(
                  glide,
                  new ApplicationLifecycle(),
                  new EmptyRequestManagerTreeNode(),
                  context.getApplicationContext());
        }
      }
    }

  @NonNull
  public RequestManager get(@NonNull FragmentActivity activity) {
        ....
  }

  @NonNull
  public RequestManager get(@NonNull Fragment fragment) {
    ....
  }

  //通過(guò) Activity 拿到 RequestManager
  @SuppressWarnings("deprecation")
  @NonNull
  public RequestManager get(@NonNull Activity activity) {
    //判斷當(dāng)前是否在子線(xiàn)程中請(qǐng)求任務(wù)
    if (Util.isOnBackgroundThread()) {
      //通過(guò) Application 級(jí)別的 Context 加載
      return get(activity.getApplicationContext());
    } else {
      //檢查 Activity 是否已經(jīng)銷(xiāo)毀
      assertNotDestroyed(activity);
      //拿到當(dāng)前 Activity 的 FragmentManager 
      android.app.FragmentManager fm = activity.getFragmentManager();
      //主要是生成一個(gè) Fragment 然后綁定一個(gè)請(qǐng)求管理 RequestManager
      return fragmentGet(
          activity, fm, /*parentHint=*/ null, isActivityVisible(activity));
    }
  }
}
  • fragmentGet 函數(shù)實(shí)現(xiàn):
  private RequestManager fragmentGet(@NonNull Context context,
      @NonNull android.app.FragmentManager fm,
      @Nullable android.app.Fragment parentHint,
      boolean isParentVisible) {
    //1. 在當(dāng)前的 Acitivty 添加一個(gè) Fragment 用于管理請(qǐng)求的生命周期
    RequestManagerFragment current = getRequestManagerFragment(fm, parentHint, isParentVisible);
    //拿到當(dāng)前請(qǐng)求的管理類(lèi)
    RequestManager requestManager = current.getRequestManager();
    //如果不存在,則創(chuàng)建一個(gè)請(qǐng)求管理者保持在當(dāng)前管理生命周期的 Fragment 中,相當(dāng)于 2 者進(jìn)行綁定,避免內(nèi)存泄漏。
    if (requestManager == null) {
      Glide glide = Glide.get(context);
      requestManager =
          factory.build(
              glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);
      current.setRequestManager(requestManager);
    }
    //返回當(dāng)前請(qǐng)求的管理者
    return requestManager;
  }

通過(guò)上面的代碼可知,這里用于 Fragment 管理請(qǐng)求的生命周期,那么我們具體來(lái)看看 Fragment 怎么添加到 Activity 中的呢:

  private RequestManagerFragment getRequestManagerFragment(
      @NonNull final android.app.FragmentManager fm,
      @Nullable android.app.Fragment parentHint,
      boolean isParentVisible) {
    //通過(guò) TAG 拿到已經(jīng)實(shí)例化過(guò)的 Fragment ,相當(dāng)于如果同一個(gè) Activity Glide.with..多次,那么就沒(méi)有必要?jiǎng)?chuàng)建多個(gè)。
    RequestManagerFragment current = (RequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG);
    //如果在當(dāng)前 Activity 中沒(méi)有拿到管理請(qǐng)求生命周期的 Fragment ,那么就從緩存中看有沒(méi)有
    if (current == null) {
      current = pendingRequestManagerFragments.get(fm);
      //如果緩存也沒(méi)有得,就直接實(shí)例化一個(gè) Fragment
      if (current == null) {
        current = new RequestManagerFragment();
        current.setParentFragmentHint(parentHint);
        //如果已經(jīng)有執(zhí)行的請(qǐng)求就開(kāi)始
        if (isParentVisible) {
          current.getGlideLifecycle().onStart();
        }
        //添加到 Map 緩存中
        pendingRequestManagerFragments.put(fm, current);
        //通過(guò)當(dāng)前 Activity 的 FragmentManager 開(kāi)始提交添加一個(gè) Fragment 容器
        fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss();
        //添加到 FragmentManager 成功,發(fā)送清理緩存。
        handler.obtainMessage(ID_REMOVE_FRAGMENT_MANAGER, fm).sendToTarget();
      }
    }
    return current;
  }

然后又回到fragmentGet方法,因?yàn)橐呀?jīng)拿到了RequestManagerFragment了: 就可以current.XXXXXX 得到信息了

  private RequestManager fragmentGet(@NonNull Context context,
      @NonNull android.app.FragmentManager fm,
      @Nullable android.app.Fragment parentHint,
      boolean isParentVisible) {
    ...
    //如果不存在,則創(chuàng)建一個(gè)請(qǐng)求管理者保持在當(dāng)前管理生命周期的 Fragment 中,相當(dāng)于 2 者進(jìn)行綁定,避免內(nèi)存泄漏。
    if (requestManager == null) {
      //拿到單例 Glide
      Glide glide = Glide.get(context);
      //構(gòu)建請(qǐng)求管理,current.getGlideLifecycle(),就是 ActivityFragmentLifecycle 后面我們會(huì)講到這個(gè)類(lèi)
      requestManager =
          factory.build(
              glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);
      //將構(gòu)建出來(lái)的請(qǐng)求管理綁定在 Fragment 中。
      current.setRequestManager(requestManager);
    }
    //返回當(dāng)前請(qǐng)求的管理者
    return requestManager;
  }

同學(xué)們我們知道,with之后,最終返回RequestManager對(duì)象, 我們需要對(duì)RequestManager對(duì)象的構(gòu)建,有一個(gè)來(lái)龍去脈的學(xué)習(xí):

【同學(xué)們注意啊:在Glide4.11 這個(gè)最新的版本中,大量使用了 工廠模式:】

 // 同學(xué)們注意:此工廠就是為了構(gòu)建出 RequestManager對(duì)象 
 private static final RequestManagerFactory DEFAULT_FACTORY = new RequestManagerFactory() {
    @NonNull
    @Override
    public RequestManager build(@NonNull Glide glide, @NonNull Lifecycle lifecycle,
        @NonNull RequestManagerTreeNode requestManagerTreeNode, @NonNull Context context) {
      //實(shí)例化
      return new RequestManager(glide, lifecycle, requestManagerTreeNode, context);
    }
  };

你只要敢 new RequestManager(....); 就會(huì)進(jìn)入 RequestManager的構(gòu)造方法:

  public RequestManager(
      @NonNull Glide glide, @NonNull Lifecycle lifecycle,
      @NonNull RequestManagerTreeNode treeNode, @NonNull Context context) {
      this(
        glide,
        lifecycle,
        treeNode,
        new RequestTracker(),
        glide.getConnectivityMonitorFactory(),
        context);
  }

  @SuppressWarnings("PMD.ConstructorCallsOverridableMethod")
  RequestManager(
      Glide glide,
      Lifecycle lifecycle,
      RequestManagerTreeNode treeNode,
      RequestTracker requestTracker,
      ConnectivityMonitorFactory factory,
      Context context) {
    this.glide = glide;
    this.lifecycle = lifecycle;
    this.treeNode = treeNode;
    this.requestTracker = requestTracker;
    this.context = context;

    connectivityMonitor =
        factory.build(
            context.getApplicationContext(),
            new RequestManagerConnectivityListener(requestTracker));

    //這里只要是添加生命周期監(jiān)聽(tīng),F(xiàn)ragment 傳遞過(guò)來(lái)的
    if (Util.isOnBackgroundThread()) {
      mainHandler.post(addSelfToLifecycle);
    } else {
      lifecycle.addListener(this);
    }
    //添加網(wǎng)絡(luò)變化的監(jiān)聽(tīng)
    lifecycle.addListener(connectivityMonitor);

    defaultRequestListeners =
        new CopyOnWriteArrayList<>(glide.getGlideContext().getDefaultRequestListeners());
    setRequestOptions(glide.getGlideContext().getDefaultRequestOptions());
        
    glide.registerRequestManager(this);
  }

同學(xué)們,到這里請(qǐng)求管理類(lèi) RequestManager + Fragment 已經(jīng)綁定成功了,聲明周期監(jiān)聽(tīng)也設(shè)置了,是不是碉堡了:

那他們相互是怎么保證生命周期的傳遞勒,我們主要看 Fragment 生命周期方法

//這里為什么監(jiān)控 Fragment 的生命周期勒,其實(shí)大家應(yīng)該也知道 Fragment 是依附在 Activity 的 Activity 的生命周期在 Fragment 中都有,所以監(jiān)聽(tīng) Fragment 就行了。
public class RequestManagerFragment extends Fragment {
  
  //相當(dāng)于生命周期回調(diào)
  private final ActivityFragmentLifecycle lifecycle;
  
  ....

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

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

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

這里的 lifecycle 是什么,同學(xué)們?cè)谏钊肟纯慈ィ?/p>

class ActivityFragmentLifecycle implements Lifecycle {
  private final Set<LifecycleListener> lifecycleListeners =
      Collections.newSetFromMap(new WeakHashMap<LifecycleListener, Boolean>());
  private boolean isStarted;
  private boolean isDestroyed;


  @Override
  public void addListener(@NonNull LifecycleListener listener) {
    lifecycleListeners.add(listener);

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

  @Override
  public void removeListener(@NonNull LifecycleListener listener) {
    lifecycleListeners.remove(listener);
  }

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

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

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

同學(xué)們,這里知道了吧,它實(shí)現(xiàn)的是 Glide 中的 Lifecycle 生命周期接口,注冊(cè)是在剛剛我們講解 RequestManagerFactory 工廠中實(shí)例化的 RequestManager 然后在構(gòu)造函數(shù)中添加了生命周期回調(diào)監(jiān)聽(tīng),具體來(lái)看下。

public class RequestManager implements LifecycleListener,
    ModelTypes<RequestBuilder<Drawable>> {
  ...
  @Override
  public synchronized void onStart() {
    resumeRequests();
    targetTracker.onStart();
  }

  @Override
  public synchronized void onStop() {
    pauseRequests();
    targetTracker.onStop();
  }

  @Override
  public synchronized void onDestroy() {
    targetTracker.onDestroy();
    for (Target<?> target : targetTracker.getAll()) {
      clear(target);
    }
    targetTracker.clear();
    requestTracker.clearRequests();
    lifecycle.removeListener(this);
    lifecycle.removeListener(connectivityMonitor);
    mainHandler.removeCallbacks(addSelfToLifecycle);
    glide.unregisterRequestManager(this);
  }
  同學(xué)們:省略代碼...      
}

同學(xué)們注意:這 3 處回調(diào)就是 Fragment 傳遞過(guò)來(lái)的,用于實(shí)時(shí)監(jiān)聽(tīng)請(qǐng)求的狀態(tài)。

with總結(jié):

根據(jù) with 源碼分析,我們知道,Glide.with(Activity) 主要做了 線(xiàn)程池 + 緩存 + 請(qǐng)求管理與生命周期綁定+其它配置初始化的構(gòu)建,內(nèi)部的代碼其實(shí)是很龐大的

二、load 源碼

load時(shí)序圖:


  • RequestBuilder : 這是一個(gè)通用請(qǐng)求構(gòu)建類(lèi),可以處理通用資源類(lèi)型的設(shè)置選項(xiàng)和啟動(dòng)負(fù)載。

同學(xué)們:load 函數(shù)加載相對(duì)于比較簡(jiǎn)單。我們看下具體代碼實(shí)現(xiàn)

public class RequestManager implements LifecycleListener,
    ModelTypes<RequestBuilder<Drawable>> {
      
  .....
    
  public RequestBuilder<Drawable> load(@Nullable String string) {
    //這里調(diào)用 Drawable 圖片加載請(qǐng)求器為其加載
    return asDrawable().load(string);
  }
  
  public RequestBuilder<Drawable> asDrawable() {
    return as(Drawable.class);
  }

  @NonNull
  @CheckResult
  @Override
  public RequestBuilder<Drawable> load(@Nullable Uri uri) {
    return asDrawable().load(uri);
  }


  @NonNull
  @CheckResult
  @Override
  public RequestBuilder<Drawable> load(@Nullable File file) {
    return asDrawable().load(file);
  }
    
  public <ResourceType> RequestBuilder<ResourceType> as(
      @NonNull Class<ResourceType> resourceClass) {
    return new RequestBuilder<>(glide, this, resourceClass, context);
  }         
}

同學(xué)們,看看load詳情:

public class RequestBuilder<TranscodeType> extends BaseRequestOptions<RequestBuilder<TranscodeType>>
    implements Cloneable, ModelTypes<RequestBuilder<TranscodeType>> {
        
  public RequestBuilder<TranscodeType> load(@Nullable String string) {
    return loadGeneric(string);
  }
  
  // 描述加載的數(shù)據(jù)源-這里可以看做是我們剛剛傳遞進(jìn)來(lái)的 http://xxxx.png
  @Nullable private Object model;
  // 描述這個(gè)請(qǐng)求是否已經(jīng)添加了加載的數(shù)據(jù)源
  private boolean isModelSet;
  
  private RequestBuilder<TranscodeType> loadGeneric(@Nullable Object model) {
    this.model = model;
    isModelSet = true;
    return this;
  }
}

同學(xué)們,到這里 RequestBuilder 就構(gòu)建好了, RequestBuilder構(gòu)建出來(lái)后,都是為了后面的into啊,也意味著,我們目前為止只是摸到Glide的一點(diǎn)點(diǎn)邊而已

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容