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<>();
/**
* 图片加载引擎,负责启动并管理缓存资源活动
*/