//load 過(guò)程
--> RequestBuilder load(String string) @RequestManager
--> asDrawable() @RequestManager
--> new RequestBuilder<>(glide, this, resourceClass, context); @RequestManager
--> load(@Nullable String string) @RequestBuilder
--> loadGeneric(string) @RequestBuilder
我們需要關(guān)心的 關(guān)鍵點(diǎn):

總結(jié)
子線(xiàn)程,用的是Application 作用域,不會(huì)搞空白的 Fragment。主線(xiàn)程,非Application 作用域,通過(guò)空白的Fragment 監(jiān)聽(tīng)。

- 每個(gè)Activity 對(duì)應(yīng)一個(gè) Fragment,然后對(duì)應(yīng)一個(gè) RequestManager。
app 包對(duì)應(yīng) RequestManagerFragment 空白 Fragment
v4 包對(duì)應(yīng) SupportRequestManagerFragment 空白 Fragment
Application 作用域?qū)?yīng) ApplicationLifecycle
非 Application 作用域?qū)?yīng) ActivityFragmentLifecycle
class ActivityFragmentLifecycle implements Lifecycle {
//管理 LifecycleListener 監(jiān)聽(tīng)器,一個(gè)Activity 對(duì)應(yīng)一個(gè) LifecycleListener
private final Set<LifecycleListener> lifecycleListeners =
Collections.newSetFromMap(new WeakHashMap<LifecycleListener, Boolean>());
private boolean isStarted;
private boolean isDestroyed;
}

Glide架構(gòu):(同學(xué)們這張圖片是網(wǎng)上的圖片而已,很模糊,有個(gè)大概的認(rèn)識(shí)就行)

一、with 源碼:

with時(shí)序圖:

Glide
- 主要做一些 init 工作,比如緩存,線(xiàn)程池,復(fù)用池的構(gòu)建等等。
RequestManagerRetriever 大管家
- 主要是獲得一個(gè) `RequestManager` 請(qǐng)求管理類(lèi),然后綁定一個(gè) Fragment 。
SupportRequestManagerFragment :
- 用于管理請(qǐng)求的生命周期。
RequestManager
- 主要用于對(duì)請(qǐng)求的管理封裝。
-
第一步:調(diào)用 with,同學(xué)們可以看下 with 這個(gè)源碼函數(shù),重載有很多:
Glide.java 類(lèi)
@NonNull
public static RequestManager with(@NonNull Context context) {
return getRetriever(context).get(context);
}
@NonNull
public static RequestManager with(@NonNull Activity activity) {
return getRetriever(activity).get(activity);
}
@NonNull
public static RequestManager with(@NonNull FragmentActivity activity) {
return getRetriever(activity).get(activity);
}
@NonNull
public static RequestManager with(@NonNull Fragment fragment) {
return getRetriever(fragment.getActivity()).get(fragment);
}
@Deprecated
@NonNull
public static RequestManager with(@NonNull android.app.Fragment fragment) {
return getRetriever(fragment.getActivity()).get(fragment);
}
@NonNull
public static RequestManager with(@NonNull View view) {
return getRetriever(view.getContext()).get(view);
}
同學(xué)們上面其實(shí)常用的就 Activity,F(xiàn)ragment, Context 這 3 種形式,下面我們就以 Activity 為主
- 第二步,getRetriever(activity):
@NonNull
private static RequestManagerRetriever getRetriever(@Nullable Context context) {
Preconditions.checkNotNull(context, "You cannot start a load on a not yet attached View or xxx.");
return get(context).getRequestManagerRetriever();
}
RequestManagerRetriever 是大管家
同學(xué)們繼續(xù)看 get(context):
public static Glide get(@NonNull Context context) {
if (glide == null) {
GeneratedAppGlideModule annotationGeneratedModule =
getAnnotationGeneratedGlideModules(context.getApplicationContext());
synchronized (Glide.class) {
if (glide == null) {
checkAndInitializeGlide(context, annotationGeneratedModule);
}
}
}
return glide;
}
同學(xué)們上面的 Glide get(Context) 是一種雙重檢測(cè)單例模式(DCL),保證了多線(xiàn)程下安全,僅此而已,非常的簡(jiǎn)單:
checkAndInitializeGlide(...); 看看做了什么:
private static void checkAndInitializeGlide(
@NonNull Context context, @Nullable GeneratedAppGlideModule generatedAppGlideModule) {
if (isInitializing) {
throw new IllegalStateException(
"You cannot call Glide.get() in registerComponents(),"
+ " use the provided Glide instance instead");
}
//是否初始化標(biāo)志
isInitializing = true;
//開(kāi)始進(jìn)行初始化
initializeGlide(context, generatedAppGlideModule);
isInitializing = false;
}
同學(xué)們接著看 initializeGlide(...)
private static void initializeGlide(
@NonNull Context context, @Nullable GeneratedAppGlideModule generatedAppGlideModule) {
//實(shí)例化一個(gè) GlideBuilder 在進(jìn)行初始化
//GlideBuilder 默認(rèn)的一些配置信息
initializeGlide(context, new GlideBuilder(), generatedAppGlideModule);
}
再接著看initializeGlide
private static void initializeGlide(@NonNull Context context, @NonNull GlideBuilder builder, GeneratedAppGlideModule annotationGeneratedModule) {
//1. 拿到應(yīng)用級(jí)別的上下文,這里可以避免內(nèi)存泄漏,我們實(shí)際開(kāi)發(fā)也可以通過(guò)這種形式拿上下文。
Context applicationContext = context.getApplicationContext();
//2. 這里拿到 @GlideModule 標(biāo)識(shí)的注解處理器生成的 GeneratedAppGlideModuleImpl、
//GeneratedAppGlideModuleFactory ...等等。
GeneratedAppGlideModule annotationGeneratedModule = getAnnotationGeneratedGlideModules();
.....
//3. 通過(guò)注解生成的代碼拿到 RequestManagerFactory
RequestManagerFactory factory = annotationGeneratedModule != null ? annotationGeneratedModule.getRequestManagerFactory() : null;
//4. 將拿到的工廠添加到 GlideBuilder
builder.setRequestManagerFactory(factory);
....
//5. 這里通過(guò) Builder 建造者模式,構(gòu)建出 Glide 實(shí)例對(duì)象
Glide glide = builder.build(applicationContext);
//6. 開(kāi)始注冊(cè)組件回調(diào)
for (com.bumptech.glide.module.GlideModule module : manifestModules) {
try {
module.registerComponents(applicationContext, glide, glide.registry);
} catch (AbstractMethodError e) {
throw new IllegalStateException(
"Attempting to register a Glide v3 module. If you see this, you or one of your"
+ " dependencies may be including Glide v3 even though you're using Glide v4."
+ " You'll need to find and remove (or update) the offending dependency."
+ " The v3 module name is: "
+ module.getClass().getName(),
e);
}
}
if (annotationGeneratedModule != null) {
annotationGeneratedModule.registerComponents(applicationContext, glide, glide.registry);
}
applicationContext.registerComponentCallbacks(glide);
//將構(gòu)建出來(lái)的 glide 賦值給 Glide 的靜態(tài)變量
Glide.glide = glide;
}
通過(guò)上面的注釋?zhuān)嘈磐瑢W(xué)們很容易理解,注意看注釋 5 ,這里知道是通過(guò)建造者生成的,那么具體內(nèi)部怎么實(shí)現(xiàn)的,接著看:
package com.bumptech.glide;
public final class GlideBuilder {
//管理線(xiàn)程池
private Engine engine;
//對(duì)象池(享元模式),這樣做避免重復(fù)創(chuàng)建對(duì)象,對(duì)內(nèi)存開(kāi)銷(xiāo)有一定效果
private BitmapPool bitmapPool;
private ArrayPool arrayPool;
//GlideExecutor 線(xiàn)程池
private GlideExecutor sourceExecutor;
private GlideExecutor diskCacheExecutor;
//本地磁盤(pán)緩存
private DiskCache.Factory diskCacheFactory;
//內(nèi)存緩存
private MemorySizeCalculator memorySizeCalculator;
private MemoryCache memoryCache;
private ConnectivityMonitorFactory connectivityMonitorFactory;
private int logLevel = Log.INFO;
private RequestOptions defaultRequestOptions = new RequestOptions();
@Nullable
private RequestManagerFactory requestManagerFactory;
private GlideExecutor animationExecutor;
private boolean isActiveResourceRetentionAllowed;
@Nullable
private List<RequestListener<Object>> defaultRequestListeners;
private boolean isLoggingRequestOriginsEnabled;
//都是一些配置信息,用到了 開(kāi)閉原則。
....
//開(kāi)始構(gòu)建,同學(xué)們注意:重點(diǎn)留意我寫(xiě)的注釋
@NonNull
Glide build(@NonNull Context context) {
//實(shí)例化一個(gè)網(wǎng)絡(luò)請(qǐng)求的線(xiàn)程池
if (sourceExecutor == null) {
sourceExecutor = GlideExecutor.newSourceExecutor();
}
//實(shí)例化一個(gè)本地磁盤(pán)緩存的線(xiàn)程池
if (diskCacheExecutor == null) {
diskCacheExecutor = GlideExecutor.newDiskCacheExecutor();
}
//實(shí)例化一個(gè)加載圖片動(dòng)畫(huà)的一個(gè)線(xiàn)程池
if (animationExecutor == null) {
animationExecutor = GlideExecutor.newAnimationExecutor();
}
//實(shí)例化一個(gè)對(duì)圖片加載到內(nèi)存的一個(gè)計(jì)算
if (memorySizeCalculator == null) {
memorySizeCalculator = new MemorySizeCalculator.Builder(context).build();
}
//實(shí)例化一個(gè)默認(rèn)網(wǎng)絡(luò)連接監(jiān)控的工廠
if (connectivityMonitorFactory == null) {
connectivityMonitorFactory = new DefaultConnectivityMonitorFactory();
}
//實(shí)例化一個(gè) Bitmap 對(duì)象池
if (bitmapPool == null) {
int size = memorySizeCalculator.getBitmapPoolSize();
//如果池子里還有可用的,直接加入 最近最少使用的 LruBitmap 容器里
if (size > 0) {
bitmapPool = new LruBitmapPool(size);
} else {
//如果池子已經(jīng)滿(mǎn)了,那么就裝在 BitmapPoolAdapter
bitmapPool = new BitmapPoolAdapter();
}
}
//實(shí)例化一個(gè)數(shù)組對(duì)象池
if (arrayPool == null) {
arrayPool = new LruArrayPool(memorySizeCalculator.getArrayPoolSizeInBytes());
}
//資源內(nèi)存緩存
if (memoryCache == null) {
memoryCache = new LruResourceCache(memorySizeCalculator.getMemoryCacheSize());
}
//磁盤(pán)緩存的工廠
if (diskCacheFactory == null) {
diskCacheFactory = new InternalCacheDiskCacheFactory(context);
}
//構(gòu)建執(zhí)行緩存策略跟線(xiàn)程池的引擎
if (engine == null) {
engine =
new Engine(
memoryCache,
diskCacheFactory,
diskCacheExecutor,
sourceExecutor,
GlideExecutor.newUnlimitedSourceExecutor(),
GlideExecutor.newAnimationExecutor(),
isActiveResourceRetentionAllowed);
}
if (defaultRequestListeners == null) {
defaultRequestListeners = Collections.emptyList();
} else {
defaultRequestListeners = Collections.unmodifiableList(defaultRequestListeners);
}
//實(shí)例化一個(gè) RequestManagerRetriever 請(qǐng)求管理類(lèi)
RequestManagerRetriever requestManagerRetriever =
new RequestManagerRetriever(requestManagerFactory);
//實(shí)例化 Glide 的地方
return new Glide(
context,
engine,
memoryCache,
bitmapPool,
arrayPool,
requestManagerRetriever,
connectivityMonitorFactory,
logLevel,
defaultRequestOptions.lock(),
defaultTransitionOptions,
defaultRequestListeners,
isLoggingRequestOriginsEnabled);
}
}
同學(xué)們上面的代碼中,builder 主要構(gòu)建線(xiàn)程池、復(fù)用池、緩存策略、執(zhí)行 Engine ,最后構(gòu)建 Glide 實(shí)例,我們看看 Glide 怎么實(shí)例化的,主要看對(duì)應(yīng)的構(gòu)造函數(shù)就行了。
Glide(
@NonNull Context context,
@NonNull Engine engine,
@NonNull MemoryCache memoryCache,
@NonNull BitmapPool bitmapPool,
@NonNull ArrayPool arrayPool,
@NonNull RequestManagerRetriever requestManagerRetriever,
@NonNull ConnectivityMonitorFactory connectivityMonitorFactory,
int logLevel,
@NonNull RequestOptions defaultRequestOptions,
@NonNull Map<Class<?>, TransitionOptions<?, ?>> defaultTransitionOptions,
@NonNull List<RequestListener<Object>> defaultRequestListeners,
boolean isLoggingRequestOriginsEnabled) {
//將 Builder 構(gòu)建的線(xiàn)程池,對(duì)象池,緩存池保存到 Glide 中
this.engine = engine;
this.bitmapPool = bitmapPool;
this.arrayPool = arrayPool;
this.memoryCache = memoryCache;
this.requestManagerRetriever = requestManagerRetriever;
this.connectivityMonitorFactory = connectivityMonitorFactory;
//拿到 Glide 對(duì)應(yīng)需要的編解碼
DecodeFormat decodeFormat = defaultRequestOptions.getOptions().get(Downsampler.DECODE_FORMAT);
bitmapPreFiller = new BitmapPreFiller(memoryCache, bitmapPool, decodeFormat);
final Resources resources = context.getResources();
registry = new Registry();
registry.register(new DefaultImageHeaderParser());
//忽略一些配置信息
...
//用于顯示對(duì)應(yīng)圖片的工廠
ImageViewTargetFactory imageViewTargetFactory = new ImageViewTargetFactory();
//構(gòu)建一個(gè) Glide 專(zhuān)屬的 上下文
glideContext =
new GlideContext(
context,
arrayPool,
registry,
imageViewTargetFactory,
defaultRequestOptions,
defaultTransitionOptions,
defaultRequestListeners,
engine,
isLoggingRequestOriginsEnabled,
logLevel);
}
同學(xué)們會(huì)發(fā)現(xiàn),上面有一個(gè) GlideContentx 這個(gè)是什么鬼? 其實(shí)就是 Context一個(gè)級(jí)別的上下文而已,你看呀
public class GlideContext extends ContextWrapper{ }
同學(xué)們到這里我們已經(jīng)知道了 緩存策略、Glide、GlideContext 怎么構(gòu)建出來(lái)的了,下面我們看怎么拿到 請(qǐng)求管理類(lèi) RequestManager
getRetriever(activity).get(activity); 最終是返回 RequestManager:
這里的 get 也有很多重載的函數(shù),同學(xué)們只需要看 Activity 參數(shù)的重載:
-
RequestManagerRetriever.java類(lèi)
public class RequestManagerRetriever implements Handler.Callback {
@NonNull
public RequestManager get(@NonNull Context context) {
if (context == null) {
throw new IllegalArgumentException("You cannot start a load on a null Context");
//如果在主線(xiàn)程中并且不為 Application 級(jí)別的 Context 執(zhí)行
} else if (Util.isOnMainThread() && !(context instanceof Application)) {
if (context instanceof FragmentActivity) {
return get((FragmentActivity) context);
} else if (context instanceof Activity) {
return get((Activity) context);
} else if (context instanceof ContextWrapper) {
//一直到查找 BaseContext
return get(((ContextWrapper) context).getBaseContext());
}
}
//如果不在主線(xiàn)程中或?yàn)?Application 就直接執(zhí)行
return getApplicationManager(context);
}
private RequestManager getApplicationManager(@NonNull Context context) {
//application 作用域,用 ApplicationLifecycle 監(jiān)聽(tīng)
if (applicationManager == null) {
synchronized (this) {
if (applicationManager == null) {
Glide glide = Glide.get(context.getApplicationContext());
applicationManager =
factory.build(
glide,
new ApplicationLifecycle(),
new EmptyRequestManagerTreeNode(),
context.getApplicationContext());
}
}
}
@NonNull
public RequestManager get(@NonNull FragmentActivity activity) {
....
}
@NonNull
public RequestManager get(@NonNull Fragment fragment) {
....
}
//通過(guò) Activity 拿到 RequestManager
@SuppressWarnings("deprecation")
@NonNull
public RequestManager get(@NonNull Activity activity) {
//判斷當(dāng)前是否在子線(xiàn)程中請(qǐng)求任務(wù)
if (Util.isOnBackgroundThread()) {
//通過(guò) Application 級(jí)別的 Context 加載
return get(activity.getApplicationContext());
} else {
//檢查 Activity 是否已經(jīng)銷(xiāo)毀
assertNotDestroyed(activity);
//拿到當(dāng)前 Activity 的 FragmentManager
android.app.FragmentManager fm = activity.getFragmentManager();
//主要是生成一個(gè) Fragment 然后綁定一個(gè)請(qǐng)求管理 RequestManager
return fragmentGet(
activity, fm, /*parentHint=*/ null, isActivityVisible(activity));
}
}
}
-
fragmentGet函數(shù)實(shí)現(xiàn):
private RequestManager fragmentGet(@NonNull Context context,
@NonNull android.app.FragmentManager fm,
@Nullable android.app.Fragment parentHint,
boolean isParentVisible) {
//1. 在當(dāng)前的 Acitivty 添加一個(gè) Fragment 用于管理請(qǐng)求的生命周期
RequestManagerFragment current = getRequestManagerFragment(fm, parentHint, isParentVisible);
//拿到當(dāng)前請(qǐng)求的管理類(lèi)
RequestManager requestManager = current.getRequestManager();
//如果不存在,則創(chuàng)建一個(gè)請(qǐng)求管理者保持在當(dāng)前管理生命周期的 Fragment 中,相當(dāng)于 2 者進(jìn)行綁定,避免內(nèi)存泄漏。
if (requestManager == null) {
Glide glide = Glide.get(context);
requestManager =
factory.build(
glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);
current.setRequestManager(requestManager);
}
//返回當(dāng)前請(qǐng)求的管理者
return requestManager;
}
通過(guò)上面的代碼可知,這里用于 Fragment 管理請(qǐng)求的生命周期,那么我們具體來(lái)看看 Fragment 怎么添加到 Activity 中的呢:
private RequestManagerFragment getRequestManagerFragment(
@NonNull final android.app.FragmentManager fm,
@Nullable android.app.Fragment parentHint,
boolean isParentVisible) {
//通過(guò) TAG 拿到已經(jīng)實(shí)例化過(guò)的 Fragment ,相當(dāng)于如果同一個(gè) Activity Glide.with..多次,那么就沒(méi)有必要?jiǎng)?chuàng)建多個(gè)。
RequestManagerFragment current = (RequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG);
//如果在當(dāng)前 Activity 中沒(méi)有拿到管理請(qǐng)求生命周期的 Fragment ,那么就從緩存中看有沒(méi)有
if (current == null) {
current = pendingRequestManagerFragments.get(fm);
//如果緩存也沒(méi)有得,就直接實(shí)例化一個(gè) Fragment
if (current == null) {
current = new RequestManagerFragment();
current.setParentFragmentHint(parentHint);
//如果已經(jīng)有執(zhí)行的請(qǐng)求就開(kāi)始
if (isParentVisible) {
current.getGlideLifecycle().onStart();
}
//添加到 Map 緩存中
pendingRequestManagerFragments.put(fm, current);
//通過(guò)當(dāng)前 Activity 的 FragmentManager 開(kāi)始提交添加一個(gè) Fragment 容器
fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss();
//添加到 FragmentManager 成功,發(fā)送清理緩存。
handler.obtainMessage(ID_REMOVE_FRAGMENT_MANAGER, fm).sendToTarget();
}
}
return current;
}
然后又回到fragmentGet方法,因?yàn)橐呀?jīng)拿到了RequestManagerFragment了: 就可以current.XXXXXX 得到信息了
private RequestManager fragmentGet(@NonNull Context context,
@NonNull android.app.FragmentManager fm,
@Nullable android.app.Fragment parentHint,
boolean isParentVisible) {
...
//如果不存在,則創(chuàng)建一個(gè)請(qǐng)求管理者保持在當(dāng)前管理生命周期的 Fragment 中,相當(dāng)于 2 者進(jìn)行綁定,避免內(nèi)存泄漏。
if (requestManager == null) {
//拿到單例 Glide
Glide glide = Glide.get(context);
//構(gòu)建請(qǐng)求管理,current.getGlideLifecycle(),就是 ActivityFragmentLifecycle 后面我們會(huì)講到這個(gè)類(lèi)
requestManager =
factory.build(
glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);
//將構(gòu)建出來(lái)的請(qǐng)求管理綁定在 Fragment 中。
current.setRequestManager(requestManager);
}
//返回當(dāng)前請(qǐng)求的管理者
return requestManager;
}
同學(xué)們我們知道,with之后,最終返回RequestManager對(duì)象, 我們需要對(duì)RequestManager對(duì)象的構(gòu)建,有一個(gè)來(lái)龍去脈的學(xué)習(xí):
【同學(xué)們注意啊:在Glide4.11 這個(gè)最新的版本中,大量使用了 工廠模式:】
// 同學(xué)們注意:此工廠就是為了構(gòu)建出 RequestManager對(duì)象
private static final RequestManagerFactory DEFAULT_FACTORY = new RequestManagerFactory() {
@NonNull
@Override
public RequestManager build(@NonNull Glide glide, @NonNull Lifecycle lifecycle,
@NonNull RequestManagerTreeNode requestManagerTreeNode, @NonNull Context context) {
//實(shí)例化
return new RequestManager(glide, lifecycle, requestManagerTreeNode, context);
}
};
你只要敢 new RequestManager(....); 就會(huì)進(jìn)入 RequestManager的構(gòu)造方法:
public RequestManager(
@NonNull Glide glide, @NonNull Lifecycle lifecycle,
@NonNull RequestManagerTreeNode treeNode, @NonNull Context context) {
this(
glide,
lifecycle,
treeNode,
new RequestTracker(),
glide.getConnectivityMonitorFactory(),
context);
}
@SuppressWarnings("PMD.ConstructorCallsOverridableMethod")
RequestManager(
Glide glide,
Lifecycle lifecycle,
RequestManagerTreeNode treeNode,
RequestTracker requestTracker,
ConnectivityMonitorFactory factory,
Context context) {
this.glide = glide;
this.lifecycle = lifecycle;
this.treeNode = treeNode;
this.requestTracker = requestTracker;
this.context = context;
connectivityMonitor =
factory.build(
context.getApplicationContext(),
new RequestManagerConnectivityListener(requestTracker));
//這里只要是添加生命周期監(jiān)聽(tīng),F(xiàn)ragment 傳遞過(guò)來(lái)的
if (Util.isOnBackgroundThread()) {
mainHandler.post(addSelfToLifecycle);
} else {
lifecycle.addListener(this);
}
//添加網(wǎng)絡(luò)變化的監(jiān)聽(tīng)
lifecycle.addListener(connectivityMonitor);
defaultRequestListeners =
new CopyOnWriteArrayList<>(glide.getGlideContext().getDefaultRequestListeners());
setRequestOptions(glide.getGlideContext().getDefaultRequestOptions());
glide.registerRequestManager(this);
}
同學(xué)們,到這里請(qǐng)求管理類(lèi) RequestManager + Fragment 已經(jīng)綁定成功了,聲明周期監(jiān)聽(tīng)也設(shè)置了,是不是碉堡了:
那他們相互是怎么保證生命周期的傳遞勒,我們主要看 Fragment 生命周期方法
//這里為什么監(jiān)控 Fragment 的生命周期勒,其實(shí)大家應(yīng)該也知道 Fragment 是依附在 Activity 的 Activity 的生命周期在 Fragment 中都有,所以監(jiān)聽(tīng) Fragment 就行了。
public class RequestManagerFragment extends Fragment {
//相當(dāng)于生命周期回調(diào)
private final ActivityFragmentLifecycle lifecycle;
....
@Override
public void onStart() {
super.onStart();
lifecycle.onStart();
}
@Override
public void onStop() {
super.onStop();
lifecycle.onStop();
}
@Override
public void onDestroy() {
super.onDestroy();
lifecycle.onDestroy();
}
...
}
這里的 lifecycle 是什么,同學(xué)們?cè)谏钊肟纯慈ィ?/p>
class ActivityFragmentLifecycle implements Lifecycle {
private final Set<LifecycleListener> lifecycleListeners =
Collections.newSetFromMap(new WeakHashMap<LifecycleListener, Boolean>());
private boolean isStarted;
private boolean isDestroyed;
@Override
public void addListener(@NonNull LifecycleListener listener) {
lifecycleListeners.add(listener);
if (isDestroyed) {
listener.onDestroy();
} else if (isStarted) {
listener.onStart();
} else {
listener.onStop();
}
}
@Override
public void removeListener(@NonNull LifecycleListener listener) {
lifecycleListeners.remove(listener);
}
void onStart() {
isStarted = true;
for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
lifecycleListener.onStart();
}
}
void onStop() {
isStarted = false;
for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
lifecycleListener.onStop();
}
}
void onDestroy() {
isDestroyed = true;
for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
lifecycleListener.onDestroy();
}
}
}
同學(xué)們,這里知道了吧,它實(shí)現(xiàn)的是 Glide 中的 Lifecycle 生命周期接口,注冊(cè)是在剛剛我們講解 RequestManagerFactory 工廠中實(shí)例化的 RequestManager 然后在構(gòu)造函數(shù)中添加了生命周期回調(diào)監(jiān)聽(tīng),具體來(lái)看下。
public class RequestManager implements LifecycleListener,
ModelTypes<RequestBuilder<Drawable>> {
...
@Override
public synchronized void onStart() {
resumeRequests();
targetTracker.onStart();
}
@Override
public synchronized void onStop() {
pauseRequests();
targetTracker.onStop();
}
@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);
}
同學(xué)們:省略代碼...
}
同學(xué)們注意:這 3 處回調(diào)就是 Fragment 傳遞過(guò)來(lái)的,用于實(shí)時(shí)監(jiān)聽(tīng)請(qǐng)求的狀態(tài)。
with總結(jié):
根據(jù) with 源碼分析,我們知道,Glide.with(Activity) 主要做了 線(xiàn)程池 + 緩存 + 請(qǐng)求管理與生命周期綁定+其它配置初始化的構(gòu)建,內(nèi)部的代碼其實(shí)是很龐大的
二、load 源碼

load時(shí)序圖:

- RequestBuilder : 這是一個(gè)通用請(qǐng)求構(gòu)建類(lèi),可以處理通用資源類(lèi)型的設(shè)置選項(xiàng)和啟動(dòng)負(fù)載。
同學(xué)們:load 函數(shù)加載相對(duì)于比較簡(jiǎn)單。我們看下具體代碼實(shí)現(xiàn)
public class RequestManager implements LifecycleListener,
ModelTypes<RequestBuilder<Drawable>> {
.....
public RequestBuilder<Drawable> load(@Nullable String string) {
//這里調(diào)用 Drawable 圖片加載請(qǐng)求器為其加載
return asDrawable().load(string);
}
public RequestBuilder<Drawable> asDrawable() {
return as(Drawable.class);
}
@NonNull
@CheckResult
@Override
public RequestBuilder<Drawable> load(@Nullable Uri uri) {
return asDrawable().load(uri);
}
@NonNull
@CheckResult
@Override
public RequestBuilder<Drawable> load(@Nullable File file) {
return asDrawable().load(file);
}
public <ResourceType> RequestBuilder<ResourceType> as(
@NonNull Class<ResourceType> resourceClass) {
return new RequestBuilder<>(glide, this, resourceClass, context);
}
}
同學(xué)們,看看load詳情:
public class RequestBuilder<TranscodeType> extends BaseRequestOptions<RequestBuilder<TranscodeType>>
implements Cloneable, ModelTypes<RequestBuilder<TranscodeType>> {
public RequestBuilder<TranscodeType> load(@Nullable String string) {
return loadGeneric(string);
}
// 描述加載的數(shù)據(jù)源-這里可以看做是我們剛剛傳遞進(jìn)來(lái)的 http://xxxx.png
@Nullable private Object model;
// 描述這個(gè)請(qǐng)求是否已經(jīng)添加了加載的數(shù)據(jù)源
private boolean isModelSet;
private RequestBuilder<TranscodeType> loadGeneric(@Nullable Object model) {
this.model = model;
isModelSet = true;
return this;
}
}
同學(xué)們,到這里 RequestBuilder 就構(gòu)建好了, RequestBuilder構(gòu)建出來(lái)后,都是為了后面的into啊,也意味著,我們目前為止只是摸到Glide的一點(diǎn)點(diǎn)邊而已。