关于Glide的生命周期设计是Glide的一个很大亮点,现在就来看一下Glide生命周期的实现。
在Glide源码解析这篇文章中就说过在Glide.with(context)
中就实现了生命周期管理,with
根据传入的参数有不同的实现。
//传入一个Context
public static RequestManager with(@NonNull Context context)
//传入一个activity
public static RequestManager with(@NonNull Activity activity)
//传入一个FragmentActivity
public static RequestManager with(@NonNull FragmentActivity activity)
//传入一个Fragment
public static RequestManager with(@NonNull Fragment fragment)
//传入一个View
public static RequestManager with(@NonNull View view)
虽然有这么多类型,但其实可以分为两类的。
- 传入一个ApplicationContext,Glide的生命周期就相当于绑定了整个应用,只要应用不退出,任何时候都能够加载,也可以理解为不对Glide生命周期进行管理。
- 传入activity、FragmentActivity 、Fragment 及View ,这样就会创建一个看不见的fragment,Glide的生命周期就随着该Fragment的变化而变化。
当传入参数为ApplicationContext时,代码实现如下。
public static RequestManager with(@NonNull Context context) {
return getRetriever(context).get(context);
}
//由于传入参数是ApplicationContext,所以最终调用getApplicationManager方法。
public RequestManager get(@NonNull Context context) {
if (context == null) {
throw new IllegalArgumentException("You cannot start a load on a null Context");
} else if (Util.isOnMainThread() && !(context instanceof Application)) {
if (context instanceof FragmentActivity) {
//判断context类型是不是FragmentActivity
return get((FragmentActivity) context);
} else if (context instanceof Activity) {
//判断context类型是不是Activity
return get((Activity) context);
} else if (context instanceof ContextWrapper) {
//判断context类型是不是ContextWrapper
return get(((ContextWrapper) context).getBaseContext());
}
}
//context类型属于ApplicationContext
return getApplicationManager(context);
}
由于传入参数是ApplicationContext,所以最终调用getApplicationManager方法。
private RequestManager getApplicationManager(@NonNull Context context) {
// Either an application context or we're on a background thread.
if (applicationManager == null) {
synchronized (this) {
if (applicationManager == null) {
Glide glide = Glide.get(context.getApplicationContext());
applicationManager =
factory.build(
glide,
new