史上最详细的glide 4.x源码分析(1) glide.with() 和glide的生命周期

简述

  • glide的优点和使用方式大家肯定都已经知道了,所以本文主要详细介绍glide的源码流程以及缓存,解码等的源码流程(非常详细,并且适合源码阅读水平不太充足的同学)。

开始

     最近在研究glide的源码,但是网上关于glide源码的文章大多不够详尽,部分方法点到即止,又因为glide源码的封装非常复杂,导致通过阅读文章只能大概分析代码流程,对于细节总是一知半解,所以写本文章的目的就是能把这些细节详细的写下来,算是对这几天glide学习的一个总结。文章会非常长,但是如果能阅读完,相信对你理解glide,以及对于其他框架、源码等的阅读都会带来帮助。

glide.with()

使用glide是第一步就是 glide.with() ,那么分析的第一步就从这个方法开始。

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

可以看到 with() 方法返回的是 RequestManager 对象,那么return中就是创建这个对象的过程,先来看 getRetriever(context) 方法

//首先调用 Glide的静态get方法初始化glide对象,然后调用getRequestManagerRetriever()创建
//RequestManagerRetriever对象

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

private static volatile Glide glide;

  public static Glide get(Context context) {
    if (glide == null) {
      synchronized (Glide.class) {
        if (glide == null) {
          checkAndInitializeGlide(context);
        }
      }
    }
    return glide;
  }
    
  public RequestManagerRetriever getRequestManagerRetriever() {
    return requestManagerRetriever;
  }

此段代码流程如下:

1、初始化glide对象, 可以看到 glide对象使用了volatile 关键字, 并且通过 synchronized 同步代码包裹创建对象的过程,这里就是经典的双重校验锁的单例。

2、获取全局变量requestManagerRetriever ,此对象在glide对象创建时创建。下文中进行分析。

checkAndInitializeGlide() 方法最终会 initializeGlide()。

private static void initializeGlide(Context context) {
    initializeGlide(context, new GlideBuilder());
}

private static void initializeGlide(Context context, GlideBuilder builder) {
    ..
    // 创建RequestManager的工厂类
    RequestManagerRetriever.RequestManagerFactory factory =
        annotationGeneratedModule != null
            ? annotationGeneratedModule.getRequestManagerFactory() : null;
    builder.setRequestManagerFactory(factory);
    // 最重要的就是此行代码,其他代码忽略
    Glide glide = builder.build(applicationContext);
    ..
    Glide.glide = glide;
  }

通过GlideBuilder.build方法创建glide对象

//先大概记住方法中创建的类的作用,后续会有详细的分析  
public Glide build(Context context) {
    // 创建资源加载线程池, 核心线程根据手机cpu核数决定,核数大于4,那么线程数为4,小于4,为cpu
//核数
    if (sourceExecutor == null) {
      sourceExecutor = GlideExecutor.newSourceExecutor();
    }
    // 缓存加载线程池  核心线程数量为1
    if (diskCacheExecutor == null) {
      diskCacheExecutor = GlideExecutor.newDiskCacheExecutor();
    }
      //动画线程池 核心线程数 cpu核数>=4,则为2,否则为1
    if (animationExecutor == null) {
      animationExecutor = GlideExecutor.newAnimationExecutor();
    }
    // 缓存大小的计算
    if (memorySizeCalculator == null) {
      memorySizeCalculator = new MemorySizeCalculator.Builder(context).build();
    }
    // 用来创建生命周期监听对象ConnectivityMonitor的工厂
    if (connectivityMonitorFactory == null) {
      connectivityMonitorFactory = new DefaultConnectivityMonitorFactory();
    }
    // 根据计算得到的缓存大小创建bitmap缓存池
    if (bitmapPool == null) {
      int size = memorySizeCalculator.getBitmapPoolSize();
      if (size > 0) {
        bitmapPool = new LruBitmapPool(size);
      } else {
        bitmapPool = new BitmapPoolAdapter();
      }
    }
 //arrayPool是对数组池,主要用于图片解析时存储临时数据用
      //根据数组池的大小创建LruArrayPool
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值