分析版本為glide:4.9.0
時序圖
with方法
- with(Context context)
- with(Activity activity)
- with(FragmentActivity activity)
- with(android.app.Fragment fragment)
- with(Fragment fragment)// v4包下
- with(View view)
所有這些with方法,首先都會根據(jù)傳入的值獲取到ApplicationContext
,生成Glide
對象悔雹,并獲取RequestManagerRetriever
對象
根據(jù)代碼分析下
首先得到Glide對象 --initializeGlide(@NonNull Context context, @NonNull GlideBuilder builder)
方法
@SuppressWarnings("deprecation")
private static void initializeGlide(@NonNull Context context, @NonNull GlideBuilder builder) {
// with方法根據(jù)不同的傳值獲取其上下文 獲取到全局的上下文
Context applicationContext = context.getApplicationContext();
// 獲取注解GlideModule的類 如果沒有自定義的GlideModule則表蝙,返回null
GeneratedAppGlideModule annotationGeneratedModule = getAnnotationGeneratedGlideModules();
List<com.bumptech.glide.module.GlideModule> manifestModules = Collections.emptyList();
// 獲取AndroidManifest.xml中meta-data中配置的GlideModule
if (annotationGeneratedModule == null || annotationGeneratedModule.isManifestParsingEnabled()) {
manifestModules = new ManifestParser(applicationContext).parse();
}
// 刪除manifestModules中與注解GlideModule重復(fù)的module
if (annotationGeneratedModule != null
&& !annotationGeneratedModule.getExcludedModuleClasses().isEmpty()) {
Set<Class<?>> excludedModuleClasses =
annotationGeneratedModule.getExcludedModuleClasses();
Iterator<com.bumptech.glide.module.GlideModule> iterator = manifestModules.iterator();
while (iterator.hasNext()) {
com.bumptech.glide.module.GlideModule current = iterator.next();
if (!excludedModuleClasses.contains(current.getClass())) {
continue;
}
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "AppGlideModule excludes manifest GlideModule: " + current);
}
iterator.remove();
}
}
... // 輸出log,無關(guān)代碼
// 獲取RequestManagerFactory對象 如果沒有自定義的GlideModule則為null
RequestManagerRetriever.RequestManagerFactory factory =
annotationGeneratedModule != null
? annotationGeneratedModule.getRequestManagerFactory() : null;
builder.setRequestManagerFactory(factory);
for (com.bumptech.glide.module.GlideModule module : manifestModules) {
module.applyOptions(applicationContext, builder);
}
if (annotationGeneratedModule != null) {
annotationGeneratedModule.applyOptions(applicationContext, builder);
}
// 生成Glide對象
Glide glide = builder.build(applicationContext);
for (com.bumptech.glide.module.GlideModule module : manifestModules) {
module.registerComponents(applicationContext, glide, glide.registry);
}
if (annotationGeneratedModule != null) {
annotationGeneratedModule.registerComponents(applicationContext, glide, glide.registry);
}
applicationContext.registerComponentCallbacks(glide);
Glide.glide = glide;
}
第二步一屋,獲取RequestManagerRetriever
對象
這步很簡單逢享,我們在生成Glide對象的時候就已經(jīng)生成的RequestManagerRetriever
對象
GlideBuilder的build方法
...
// 根據(jù)上面分析芙扎,我們?nèi)绻麤]有寫自定義GlideModule方法,requestManagerFactory為null
RequestManagerRetriever requestManagerRetriever =
new RequestManagerRetriever(requestManagerFactory);
return new Glide(
context,
engine,
memoryCache,
bitmapPool,
arrayPool,
requestManagerRetriever,
connectivityMonitorFactory,
logLevel,
defaultRequestOptions.lock(),
defaultTransitionOptions,
defaultRequestListeners,
isLoggingRequestOriginsEnabled);
}
RequestManagerRetriever.java
public RequestManagerRetriever(@Nullable RequestManagerFactory factory) {
// 如果factory為空,使用默認(rèn)的RequestManagerFactory
this.factory = factory != null ? factory : DEFAULT_FACTORY;
// 此處愧薛,我覺得很重要
handler = new Handler(Looper.getMainLooper(), this /* Callback */);
}
第三步,獲取RequestManager
對象
根據(jù)我們調(diào)用with方法傳入的對象獲取RequestManager
對象
如果當(dāng)前是后臺線程诊赊,直接獲取ApplicationContext處理
我們先來分析在當(dāng)前UI線程
@NonNull
public RequestManager get(@NonNull Activity activity) {
if (Util.isOnBackgroundThread()) {
return get(activity.getApplicationContext());
} else {
assertNotDestroyed(activity);
android.app.FragmentManager fm = activity.getFragmentManager();
return fragmentGet(
activity, fm, /*parentHint=*/ null, isActivityVisible(activity));
}
}
@Deprecated
@NonNull
private RequestManager fragmentGet(@NonNull Context context,
@NonNull android.app.FragmentManager fm,
@Nullable android.app.Fragment parentHint,
boolean isParentVisible) {
// 獲取RequestManagerFragment
RequestManagerFragment current = getRequestManagerFragment(fm, parentHint, isParentVisible);
// 獲取fragment中的requestManager
RequestManager requestManager = current.getRequestManager();
if (requestManager == null) {
// TODO(b/27524013): Factor out this Glide.get() call.
Glide glide = Glide.get(context);
// 如果沒有厚满,則新建一個,并設(shè)置到fragment中
// factory 如果我們沒有自定的module設(shè)置的話碧磅,使用的是默認(rèn)的factory
requestManager =
factory.build(
glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);
current.setRequestManager(requestManager);
}
return requestManager;
}
獲取RequestManagerFragment
@NonNull
private RequestManagerFragment getRequestManagerFragment(
@NonNull final android.app.FragmentManager fm,
@Nullable android.app.Fragment parentHint,
boolean isParentVisible) {
// 先從FragmentManager中找看是否已經(jīng)存在該fragment
RequestManagerFragment current = (RequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG);
if (current == null)
// 如果沒有碘箍,則從我們自己的Map中找
current = pendingRequestManagerFragments.get(fm);
if (current == null) {
// 如果都沒有,則新建一個fragment
current = new RequestManagerFragment();
current.setParentFragmentHint(parentHint);
// 如果當(dāng)前Activity沒有isFinishing則isParentVisible為true
if (isParentVisible) {
// 觸發(fā)lifecycle的onStart方法
current.getGlideLifecycle().onStart();
}
//放入自己的map中
pendingRequestManagerFragments.put(fm, current);
// 開啟事物鲸郊,加tag 顯示fragment
fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss();
handler.obtainMessage(ID_REMOVE_FRAGMENT_MANAGER, fm).sendToTarget();
}
}
return current;
}
獲取requestManager對象 最終調(diào)用RequestManager的構(gòu)造方法
RequestManager(
Glide glide,
Lifecycle lifecycle,
RequestManagerTreeNode treeNode,
RequestTracker requestTracker,
ConnectivityMonitorFactory factory,
Context context) {
this.glide = glide;
// lifecycle 為fragment中的ActivityFragmenLifecycle對象
this.lifecycle = lifecycle;
this.treeNode = treeNode;
// 請求追蹤器 requestTracker = new RequestTracker()
this.requestTracker = requestTracker;
this.context = context;
// 連接的監(jiān)聽器
connectivityMonitor =
factory.build(
context.getApplicationContext(),
new RequestManagerConnectivityListener(requestTracker));
// If we're the application level request manager, we may be created on a background thread.
// In that case we cannot risk synchronously pausing or resuming requests, so we hack around the
// issue by delaying adding ourselves as a lifecycle listener by posting to the main thread.
// This should be entirely safe.
if (Util.isOnBackgroundThread()) {
mainHandler.post(addSelfToLifecycle);
} else {
// 如果不是后臺線程丰榴,則添加listener
lifecycle.addListener(this);
}
// 添加連接監(jiān)聽器
lifecycle.addListener(connectivityMonitor);
defaultRequestListeners =
new CopyOnWriteArrayList<>(glide.getGlideContext().getDefaultRequestListeners());
setRequestOptions(glide.getGlideContext().getDefaultRequestOptions());
// 把requestManager注冊到glide中
glide.registerRequestManager(this);
}
當(dāng)我們所在的Activity執(zhí)行onStop()
方法之后,所關(guān)聯(lián)的fragment
也會執(zhí)行onStop()
方法
RequestManagerFragment.java
public void onStop() {
super.onStop();
// lifecycle為ActivityFragmentLifecycle
lifecycle.onStop();
}
ActivityFragmentLifecycle.java
void onStop() {
isStarted = false;
//迭代注冊的listener 執(zhí)行onStop方法
// 一個listener為RequestManager
// 一個為connectivityMonitor
for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
lifecycleListener.onStop();
}
}
RequestManager.java
public synchronized void onStop() {
pauseRequests();
targetTracker.onStop();
}
public synchronized void pauseRequests() {
// requestTracker 為RequestTracker對象 在RequestManager構(gòu)造函數(shù)中創(chuàng)建
requestTracker.pauseRequests();
}
RequestTracker.java
/**
* Stops any in progress requests. 停止任何正在進(jìn)行的請求
*/
public void pauseRequests() {
isPaused = true;
for (Request request : Util.getSnapshot(requests)) {
if (request.isRunning()) {
request.clear();
// 將請求加入list
pendingRequests.add(request);
}
}
}
到此秆撮,頁面onStop后四濒,Glide不在加載
同理 頁面onStart()恢復(fù)之后
RequestTracker.java
/**
* Starts any not yet completed or failed requests.
* 開始沒有完成或者失敗的請求
*/
public void resumeRequests() {
isPaused = false;
for (Request request : Util.getSnapshot(requests)) {
// We don't need to check for cleared here. Any explicit clear by a user will remove the
// Request from the tracker, so the only way we'd find a cleared request here is if we cleared
// it. As a result it should be safe for us to resume cleared requests.
if (!request.isComplete() && !request.isRunning()) {
request.begin();
}
}
// 清空列表
pendingRequests.clear();
}
onDestory()
/**
* Lifecycle callback that cancels all in progress requests and clears and recycles resources for
* all completed requests.
* 清空所有的請求,glide與RequestManager解除關(guān)系
*/
@Override
public synchronized void onDestroy() {
targetTracker.onDestroy();
for (Target<?> target : targetTracker.getAll()) {
clear(target);
}
targetTracker.clear();
requestTracker.clearRequests();
lifecycle.removeListener(this);
lifecycle.removeListener(connectivityMonitor);
mainHandler.removeCallbacks(addSelfToLifecycle);
glide.unregisterRequestManager(this);
}