Glide源码分析之with方法

本文深入探讨Glide的with方法,从Glide.with(FragmentActivity)开始,逐步解析Glide.getRetriever(), Glide.initializeGlide()等关键步骤。通过源码分析,了解Glide如何初始化、管理生命周期以及请求管理器的获取过程。同时,文章提到了通过清单文件加载配置、RequestManager的生命周期感知以及单例模式的应用。" 112075376,10543626,MadMapper 3.7:超强光雕投影软件,打造无限创意视觉,"['视频映射工具', '舞台设计', '艺术装置', '投影技术', '创意软件']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Glide 是一个开源的图片处理库,源代码的学习对于我们的帮助是非常大的,不过要看源码项目总得有个流程,这里我就从 Glide.with(FragmentActivity).load(URL).apply(centerCropTransform()) .into(imageViewRes); 作为阅读流程,首先就从 with(FragmentActivity) 开始开始吧。

(PS:本人阅读的源码为 Glide 4.7 版本)

首先来看下面的 with 方法的流程时序图:
这里写图片描述

接着就来依据这个时序图来阅读以下 Glide 的源码吧。

Step1 Glide.with(FragmentActivity)
    /**
     * 传入FragmentActivity对象来启动Glide并绑定FragmentActivity的生命周期,设置默认配置
     *
     * @param FragmentActivity 当前绑定的FragmentActivity
     * @return 绑定了当前activity的RequestManager, 可调用load方法加载数据
     */
    @NonNull
    public static RequestManager with(@NonNull FragmentActivity fragmentActivity) {
   
        return getRetriever(activity).get(activity);
    }

调用当前类的 getRetriever 方法。

Step2 Glide.getRetriever(Context)
    private static RequestManagerRetriever getRetriever(@Nullable Context context) {
   
        //空指针检查,context为null则直接抛出空指针异常
        Preconditions.checkNotNull(context,
        "You cannot start a load on a not yet attached View or a Fragment where getActivity() "
        + "returns null (which usually occurs when getActivity() is called before the Fragment "
                        + "is attached or after the Fragment is destroyed).");
        return Glide.get(context).getRequestManagerRetriever();
    }

Preconditions 这里并非 support v4 里面的那个 Preconditions 工具类, 因为后者存在着使用限制,因此 Glide 里面就直接把它需要的代码拷贝过来使用了:

/**
 * 这里是复制v4包的内部参数检查工具类,主要是检查参数是否正常,不正常就抛出异常确保外部今早发现问题
 * 个人猜测是因为v4包里面的Preconditions工具类存在某些使用限制,这里才直接复制出来
 */

public final class Preconditions {
   
    //代码省略
}
Step3 Glide.get(Context)
    /**
     * volatile确保内存可见性,进一步确保单例
     */
    private static volatile Glide glide;
    //..........
    /**
     * 生成或获取Glide的单例对象
     *
     * @return 单例对象
     */
    @NonNull
    public static Glide get(@NonNull Context context) {
   
        if (glide == null) {
   
            synchronized (Glide.class) {
   
                if (glide == null) {
   
                    checkAndInitializeGlide(context);
                }
            }
        }
        return glide;
    }
Step4 Glide.checkAndInitializeGlide(Context)
   /**
     * volatile确保内存可见性,进一步确保单例
     */
    private static volatile boolean isInitializing;
    
    private static void checkAndInitializeGlide(Context context) {
   
        // 在Glide初始化的过程中,可能会多次调用Glide.get(context)
        // 为避免多次初始化,这里加了一个检查判断,确保Glide对象为单例
        if (isInitializing) {
   
            throw new IllegalStateException("You cannot call Glide.get() in registerComponents(),"+ " use the provided Glide instance instead");
        }
        isInitializing = true;
        initializeGlide(context);
        isInitializing = false;
    }
Step4 Glide.initializeGlide()
   /**
     * Glide的初始化方法
     *
     * @param context 上下文
     */
    private static void initializeGlide(Context context) {
   
        initializeGlide(context, new GlideBuilder());
    }

这里创建一个 GlideBuilder 对象,它是一个用于设置 Glide 默认配置的构建者类:

/**
 * 用于设置Glide默认配置使用的构建者类
 */
public final class GlideBuilder {
   
    /**
     * 图片变换处理的Map集合
     * 图片变化处理就是指圆角图片之类的处理
     */
    private final Map<Class<?>, TransitionOptions<?, ?>> defaultTransitionOptions = new ArrayMap<>();
    /**
     * 图片加载引擎,负责启动并管理缓存资源活动
     */
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值