Glide 原理 1 - with

幻昼 2024年03月29日 25次浏览

先来一张整体架构图,版本不详,后面分析基于新版 Glide 4.16.0

Glide-framework

with 调用

Glide内部会在 Activity/Fragment生命周期监听,网络变化监听,自动取消加
载或者重新加载,等等

glide

活动图

活动图

旧版的Glide,作用域为非Application时,通过一个空白 fragment 监听界面的生命周期,回调到 Glide 内部

新版 Glide 已经废弃了 RequestManagerFragment,不再被视为最佳实践,且存在一些潜在的问题。RequestManagerFragment 主要用于在 Android 生命周期中管理 Glide 请求,以确保在 Activity 或 Fragment 生命周期中正确地加载和清理图像。

然而,随着时间的推移,Google 推出了更好的生命周期管理解决方案,如LifecycleOwner 和 ViewModel。这些组件提供了更灵活和可靠的方式来管理组件的生命周期。

获取 RequestManager 的类变成了 LifecycleRequestManagerRetriever ,在创建 RequestManager 时会传入 lifecycle,并把自己添加为 lifecycle 的 listener

lifecycle.addListener(RequestManager.this);

RequestManager 实现了 LifecycleListener

public interface LifecycleListener {
  void onStart();
  void onStop();
  void onDestroy();
}

Fragment/Activity生命周期: 当我们的Fragment或Activity不可见的时候 暂停请
求, 当我们的Fragment或Activity可见的时候 恢复请求,当销毁时就取消请求

收到 lifecycle onDestroy 时间后就移除自身

  public synchronized void onDestroy() {
    targetTracker.onDestroy();
    clearRequests();
    requestTracker.clearRequests();
    // 移除自身
    lifecycle.removeListener(this);
    
    lifecycle.removeListener(connectivityMonitor);
    Util.removeCallbacksOnUiThread(addSelfToLifecycle);
    glide.unregisterRequestManager(this);
  }

为何去监听Fragment/Activity生命周期

总结:
以确保优先处理前台可见的 Activity / Fragment,提高资源利用率;
在有必要时释放资源以避免在应用在后台时被杀死,提高稳定性

生命周期作用域Application,Activity,Fragment

跟进代码,调用 Glide.with 时,会走到 RequestManagerRetriever 的 get

  public static RequestManager with(@NonNull Context context) {
    return getRetriever(context).get(context);
  }

在 get 方法里面区分要绑定的各个生命周期

  public RequestManager get(@NonNull Context context) {
      
      
  if (Util.isOnMainThread() && !(context instanceof Application)) {
      if (context instanceof FragmentActivity) {
          
        return get((FragmentActivity) context);
          
      } else if (context instanceof ContextWrapper
          && ((ContextWrapper) context).getBaseContext().getApplicationContext() != null) {
          
        return get(((ContextWrapper) context).getBaseContext());
          
      }
    }

    return getApplicationManager(context);
  }

必须是主线程和关联的生命周期 owner 非 Application 才绑定界面更具体的生命周期

子线程或全局生命周期就创建 ApplicationManager 的 RequestManager

lifecycle

生命周期的绑定监听

Glide 的 LifecycleLifecycle 完全 implements Lifecycle, LifecycleObserver

完整接入了 Androidx 的生命周期管理机制

把 RequestManager 添加到 listener 后即可绑定

final class LifecycleLifecycle implements Lifecycle, LifecycleObserver {
// ……

  @OnLifecycleEvent(Event.ON_START)
  public void onStart(@NonNull LifecycleOwner owner) {
    for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
      lifecycleListener.onStart();
    }
  }

  @OnLifecycleEvent(Event.ON_STOP)
  public void onStop(@NonNull LifecycleOwner owner) {
    for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
      lifecycleListener.onStop();
    }
  }

  @OnLifecycleEvent(Event.ON_DESTROY)
  public void onDestroy(@NonNull LifecycleOwner owner) {
    for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
      lifecycleListener.onDestroy();
    }
    owner.getLifecycle().removeObserver(this);
  }
}

Glide 对象

返回第一步,获取 RequestManagerRetriever 方法

可以看到先 Glide.get(context) 获取了一个 Glide 对象,跟进去

  private static RequestManagerRetriever getRetriever(@Nullable Context context) {
    return Glide.get(context).getRequestManagerRetriever();
  }


  public static Glide get(@NonNull Context context) {
    if (glide == null) {
        // ……
      synchronized (Glide.class) {
        if (glide == null) {
          checkAndInitializeGlide(context, annotationGeneratedModule);
        }
      }
    }
      
  static void checkAndInitializeGlide(
      @NonNull Context context, @Nullable GeneratedAppGlideModule generatedAppGlideModule) {
      // 跟进
      initializeGlide(context, generatedAppGlideModule);
  }
      
      
  private static void initializeGlide(
      @NonNull Context context,
      @NonNull GlideBuilder builder,
      @Nullable GeneratedAppGlideModule annotationGeneratedModule) {
    Context applicationContext = context.getApplicationContext();
      ……
    // 这里通过 Builder 建造者模式,构建出 Glide 实例对象
    Glide glide = builder.build(applicationContext, manifestModules, annotationGeneratedModule);
    Glide.glide = glide;
  }
      
// 再看看 GlideBuilder 内部逻辑

GlideBuilder

public final class GlideBuilder {

  // note jin: 管理线程池
  private Engine engine;
  // 对象池(享元模式),这样做避免重复创建对象,对内存开销有一定效果
  private BitmapPool bitmapPool;
  private ArrayPool arrayPool;
  // note jin: 内存缓存
  private MemoryCache memoryCache;
  // note jin: GlideExecutor 线程池
  private GlideExecutor sourceExecutor;
  private GlideExecutor diskCacheExecutor;
  // note jin: 本地磁盘缓存
  private DiskCache.Factory diskCacheFactory;
  private MemorySizeCalculator memorySizeCalculator;
  private ConnectivityMonitorFactory connectivityMonitorFactory;
    
    ……
    
  Glide build(
      @NonNull Context context,
      List<GlideModule> manifestModules,
      AppGlideModule annotationGeneratedGlideModule) {
    // note jin: 实例化一个网络请求的线程池
    if (sourceExecutor == null) {
      sourceExecutor = GlideExecutor.newSourceExecutor();
    }

    // note jin: 实例化一个本地磁盘缓存的线程池
    if (diskCacheExecutor == null) {
      diskCacheExecutor = GlideExecutor.newDiskCacheExecutor();
    }

    // note jin: 实例化一个加载图片动画的一个线程池
    if (animationExecutor == null) {
      animationExecutor = GlideExecutor.newAnimationExecutor();
    }

    // note jin: 实例化一个对图片加载到内存的一个计算
    if (memorySizeCalculator == null) {
      memorySizeCalculator = new MemorySizeCalculator.Builder(context).build();
    }

    // note jin: 实例化一个默认网络连接监控的工厂
    if (connectivityMonitorFactory == null) {
      connectivityMonitorFactory = new DefaultConnectivityMonitorFactory();
    }

    if (bitmapPool == null) {
      // note jin: 实例化一个 Bitmap 对象池
      int size = memorySizeCalculator.getBitmapPoolSize();
      if (size > 0) {
        // note jin: 如果池子里还有可用的,直接加入 最近最少使用的 LruBitmap 容器里
        bitmapPool = new LruBitmapPool(size);
      } else {
        // note jin: 如果池子已经满了,那么就装在 BitmapPoolAdapter
        bitmapPool = new BitmapPoolAdapter();
      }
    }

    if (arrayPool == null) {
      arrayPool = new LruArrayPool(memorySizeCalculator.getArrayPoolSizeInBytes());
    }

    // note jin: 资源内存缓存
    if (memoryCache == null) {
      memoryCache = new LruResourceCache(memorySizeCalculator.getMemoryCacheSize());
    }

    // note jin: 磁盘缓存的工厂
    if (diskCacheFactory == null) {
      diskCacheFactory = new InternalCacheDiskCacheFactory(context);
    }

    // note jin: 构建执行缓存策略跟线程池的引擎
    if (engine == null) {
      engine =
          new Engine(
              memoryCache,
              diskCacheFactory,
              diskCacheExecutor,
              sourceExecutor,
              GlideExecutor.newUnlimitedSourceExecutor(),
              animationExecutor,
              isActiveResourceRetentionAllowed);
    }

    if (defaultRequestListeners == null) {
      defaultRequestListeners = Collections.emptyList();
    } else {
      defaultRequestListeners = Collections.unmodifiableList(defaultRequestListeners);
    }

    GlideExperiments experiments = glideExperimentsBuilder.build();
    // note jin: 实例化一个 RequestManagerRetriever 请求管理类
    RequestManagerRetriever requestManagerRetriever =
        new RequestManagerRetriever(requestManagerFactory);

    // note jin: 实例化 Glide
    return new Glide(
        context,
        engine,
        memoryCache,
        bitmapPool,
        arrayPool,
        requestManagerRetriever,
        connectivityMonitorFactory,
        logLevel,
        defaultRequestOptionsFactory,
        defaultTransitionOptions,
        defaultRequestListeners,
        manifestModules,
        annotationGeneratedGlideModule,
        experiments);
  }
}