Glide源码解析01-with
最简单的Glide调用,如下所示,下面将根据Glide的调用顺序,进行源码解析。
Glide.with(this)
.load(uri)
.into(img);
With方法
先来看with方法
简析
With方法有很多重载。
包括FragmentActivity、Activity、Fragment、Fragment v4。
with方法中,会与传入的这些类的生命周期进行绑定。
[ 前提是在主线程执行with(),否则会和Application的声明周期绑定。]
AppCompatActivity继承自FragmentActivity
详情
以FragmentActivity的重载为例。
1.0 Glide.with()
内部会先获取RequestManagerRetriever对象,
RequestManagerRetriever的作用是创建新的RequestManager或从activities和fragment中获取已存在的RequestManager。
public static RequestManager with(FragmentActivity activity) {
RequestManagerRetriever retriever = RequestManagerRetriever.get();
return retriever.get(activity);
}
1.1 retriever.get(FragmentActivity)
内部会判断当前线程。
如果是异步线程,那么调用get(Context)和Application的声明周期绑定
如果是主线程,那么调用supportFragmentGet()和activity声明周期绑定
public RequestManager get(FragmentActivity activity) {
if (Util.isOnBackgroundThread()) {
return get(activity.getApplicationContext());
} else {
assertNotDestroyed(activity);
FragmentManager fm = activity.getSupportFragmentManager();
return supportFragmentGet(activity, fm);
}
}
1.2 RequestManager#get(Context):绑定Application生命周期
内部会调用RequestManager#getApplicationManager(),从而传入context创建一个RequestManager。
private RequestManager getApplicationManager(Context context) {
if (是否为空和加锁) { //单例
applicationManager = new RequestManager(context.getApplicationContext(),
new ApplicationLifecycle(), new EmptyRequestManagerTreeNode());
}
return applicationManager;
}
1.3 RequestManager#supportFragmentGet(): 绑定FragmentActivity生命周期
SupportRequestManagerFragment是Glide自己写的一个Fragment,是一个隐藏的Fragment。
Glide通过这个Fragment就可以监听到Activity的生命周期,从而绑定Activity的生命周期。
RequestManager supportFragmentGet(Context context, FragmentManager fm) {
//如果存在则获取,不存在则创建SupportRequestManagerFragment
SupportRequestManagerFragment current = getSupportRequestManagerFragment(fm);
//检查SupportRequestManagerFragment中RequestManager是否存在
RequestManager requestManager = current.getRequestManager();
if (requestManager == null) {
requestManager = new RequestManager(context, current.getLifecycle(), current.getRequestManagerTreeNode());
current.setRequestManager(requestManager);
}
return requestManager;
}
至此,Glide.with方法就执行完了,并返回RequestManager对象。
更多
Glide源码解析01-with
Glide源码解析02-load
Glide源码解析03-into
Glide源码解析04-decode
Glide源码解析05-onLoadComplete
Glide源码解析06-Glide流程图