Glide 官方地址
因为很好奇Glide的加载原理,看了别人的分析之后印象还是不够深,这里自己分析一下,记录一些源码流程,方便记忆。
Glide.with(context).load(url).into(adImageView);
让我看看Glide这句话做了些什么吧!
Glide.with(context)
public static RequestManager with(Context context) {
RequestManagerRetriever retriever = RequestManagerRetriever.get();
return retriever.get(context);
}
先获取了一个RequestManagerRetriever对象
public RequestManager get(Context context) {
if (context == null) {
throw new IllegalArgumentException("You cannot start a load on a null Context");
//判断当前线程是否是主线程,并且不是application
} else if (Util.isOnMainThread() && !(context instanceof Application)) {
//判断context是什么类型的
if (context instanceof FragmentActivity) {
return get((FragmentActivity) context);
} else if (context instanceof Activity) {
return get((Activity) context);
} else if (context instanceof ContextWrapper) {
return get(((ContextWrapper) context).getBaseContext());
}
}
return getApplicationManager(context);
}
然后调用了RequestManagerRetriever的get(Context context)方法,这里主要是判断当前的context属于什么,根据context去创建对应的RequestManager这里我们插一下,如果我们传的是Application的context怎么办的。
private RequestManager getApplicationManager(Context context) {
if (applicationManager == null) {
synchronized (this) {
if (applicationManager == null) {
//我们这里为其创建了一个单例的applicationManager
applicationManager = new RequestManager(context.getApplicationContext(),
new ApplicationLifecycle(), new EmptyRequestManagerTreeNode());
}
}
}
return applicationManager;
}
其实很简单,就是创建了一个单例的applicationManager。那我们继续分析。
public RequestManager get(FragmentActivity activity) {
//判断是否是后台线程
if (Util.isOnBackgroundThread()) {
//如果在子线程,直接用application的context
return get(activity.getApplicationContext());
} else {
//判断此activity是否已经销毁了
assertNotDestroyed(activity);
//获取能管理和当前Activity有关联的Fragment的FragmentManager。
FragmentManager fm = activity.getSupportFragmentManager();
return supportFragmentGet(activity, fm);
}
}
当我们传入的是一个FragmentActivity时,我们要拿到和当前有关联的FragmentManager,我们通过这个FragmentManager去创建RequestManager
RequestManager supportFragmentGet(Context context, FragmentManager fm) {
//从缓存中获取fragment,如果没有就创建
SupportRequestManagerFragment current = getSupportRequestManagerFragment(fm);
//获取当前的requestManager,第一次为空
RequestManager requestManager = current.getRequestManager();
if (requestManager == null) {
//为空时给其创建一个requestManager
requestManager = new RequestManager(context, current.getLifecycle()
, current.getRequestManagerTreeNode());
current.setRequestManager(requestManager);
}
return requestManager;
}
这里先去缓存获取,因为我们可能在activity中多个地方去加载图片了,这里优化了内存。第一次一般都为空,会创建requestManager对象,其中current.getLifecycle()需要
注意一下,然后把当前requestManager返回了。
我们先看一下getSupportRequestManagerFragment()这个方法
SupportRequestManagerFragment getSupportRequestManagerFragment(final FragmentManager fm) {
//获取当前fm,第一次为空
SupportRequestManagerFragment current = (SupportRequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG);
if (current == null) {
//从缓存中获取,第一次应该为空
current = pendingSupportRequestManagerFragments.get(fm);
if (current == null) {
//当为空时,创建一个自己的SupportRequestManagerFragment
current = new SupportRequestManagerFragment();
//加入到缓存中
pendingSupportRequestManagerFragments.put(fm, current);
//显示fragment
fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss();
handler.obtainMessage(ID_REMOVE_SUPPORT_FRAGMENT_MANAGER, fm).sendToTarget();
}
}
return current;
}
这个方法就开始去缓存获取了,如果有就返回,否则就会创建一个SupportRequestManagerFragment然后加入到界面中,其实就是Fragment。
到这里为止,glide的with就分析完了,流程图如下:

with.png
load(url)
public DrawableTypeRequest<String> load(String string) {
return (DrawableTypeRequest<String>) fromString().load(string);
}