public static RequestManager with(@NonNull FragmentActivity activity) {
return getRetriever(activity).get(activity);
}
前面說到,getRetriever() 方法返回了 RequestManagerRetriever 對象亥啦,這次來看看 get 方法怎么獲取 RequestManager。
get() 實(shí)現(xiàn)了重載弃锐,根據(jù)入?yún)㈩愋筒煌譃?FragmentActivity, Activity, Fragment 等瑰排,
public RequestManager get(@NonNull FragmentActivity activity) {
if (Util.isOnBackgroundThread()) {
return get(activity.getApplicationContext());
} else {
assertNotDestroyed(activity);
frameWaiter.registerSelf(activity);
FragmentManager fm = activity.getSupportFragmentManager();
return supportFragmentGet(activity, fm, null, isActivityVisible(activity));
}
}
假設(shè)我們是在 Activity 上發(fā)起的圖片加載捉貌,那么會(huì)觸發(fā)這個(gè)方法的調(diào)用支鸡。首先會(huì)對當(dāng)前線程做區(qū)分,非主線程會(huì)采用 ApplicationContext 作為入?yún)⒊们裕绻侵骶€程就會(huì)利用 FragmentManager牧挣,
private RequestManager supportFragmentGet(Context context, FragmentManager fm, Fragment parentHint, boolean isParentVisible) {
SupportRequestManagerFragment current = getSupportRequestManagerFragment(fm, parentHint);
RequestManager requestManager = current.getRequestManager();
if (requestManager == null) {
Glide glide = Glide.get(context);
requestManager = factory.build(glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);
current.setRequestManager(requestManager);
}
return requestManager;
}
為啥會(huì)用到 FragmentManager,原來 Glide 定義了一個(gè) SupportRequestManagerFragment 用來存儲(chǔ) RequestManager醒陆,這個(gè) Fragment 我覺得可以不用理解為我們平時(shí)用的 Fragment瀑构,而更像是僅用作一個(gè)生命周期管理的載體,跟頁面展示無關(guān)刨摩。
所以頁面不同使得 FragmentManager 不同寺晌,F(xiàn)ragmentManager 不同使得 Fragment 不同世吨,進(jìn)而使得 RequestManager 不同。這么說來 RequestManager 就跟 Activity 相關(guān)了呻征,如果多個(gè) Fragment 用同一個(gè) FragmentManager耘婚,那么就持有同一個(gè) RequestManager 對象。
一開始陆赋,這個(gè) Fragment 里肯定沒有 RequestManager 對象沐祷,要去創(chuàng)建,創(chuàng)建它的工廠對象在創(chuàng)建 RequestManagerRetriever 對象時(shí)賦值攒岛,但實(shí)際的來源是在 GlideBuilder 的配置上赖临,
private static void initializeGlide(/**省略**/) {
RequestManagerRetriever.RequestManagerFactory factory = annotationGeneratedModule != null ? annotationGeneratedModule.getRequestManagerFactory() : null;
builder.setRequestManagerFactory(factory);
}
但這其實(shí)也有條件,如果我們開發(fā)者沒有去利用注解配置灾锯,那就是 null, 可見還有地方?jīng)]分析到兢榨,
public RequestManagerRetriever(RequestManagerFactory factory, GlideExperiments experiments) {
this.factory = factory != null ? factory : DEFAULT_FACTORY;
//省略部分代碼......
}
private static final RequestManagerFactory DEFAULT_FACTORY = new RequestManagerFactory() {
@Override
public RequestManager build(Glide glide, Lifecycle lifecycle, RequestManagerTreeNode requestManagerTreeNode, Context context) {
return new RequestManager(glide, lifecycle, requestManagerTreeNode, context);
}
}
順著思路再看就會(huì)發(fā)現(xiàn),RequestManagerRetriever 的構(gòu)造方法做了保證挠进,默認(rèn)返回了一個(gè) RequestManager 對象色乾。
最后會(huì)和 Fragment 做一個(gè)關(guān)聯(lián),并將這個(gè) RequestManager 對象返回领突。如果下次還是同一個(gè) Activity暖璧,那就不會(huì)再新創(chuàng)建了,而是之前返回君旦。
至此澎办,with 方法算是看的差不多了,也了解了一些相關(guān)概念金砍,隨著后面方法的梳理局蚀,再慢慢將這個(gè)孤立的概念關(guān)聯(lián)起來。