Glide管理生命周期還是很有想法的,這種思路值得我們?nèi)W(xué)習(xí)和應(yīng)用;
特點
1.不用我們自己手動去實現(xiàn)他的接口或者注冊;
實現(xiàn)原理
1.通過Fragment依附Activity來監(jiān)聽生命周期變化;
2.本身不關(guān)注上層FragmentActivity或者Activity實現(xiàn);
3.glide通過本身實例化一個Fragment,來添加到FragmentActivity或者Activity,這樣只要關(guān)注該Fragment就可以知道生命周期變化;
大概畫了一個時序圖
源碼分析
Glide.with()方法參數(shù)可以是Activity,FragmentActivity,Fragment等,我們這里與with(@NonNull Activity activity)來分析,其他的類似:
Glide.class
@NonNull
public static RequestManager with(@NonNull Activity activity) {
return getRetriever(activity).get(activity);
}
RequestManagerRetriever 獲得該對象,我們這里不去關(guān)心,你只要知道Glide對象實例化的時候會初始化;
RequestManagerRetriever.class
@SuppressWarnings("deprecation")
@NonNull
public RequestManager get(@NonNull Activity activity) {
if (Util.isOnBackgroundThread()) {ir
return get(activity.getApplicationContext());
} else {
assertNotDestroyed(activity);
//獲取FragmentManager
android.app.FragmentManager fm = activity.getFragmentManager();
//重點在這里
return fragmentGet(
activity, fm, /*parentHint=*/ null, isActivityVisible(activity));
}
}
@SuppressWarnings({"deprecation", "DeprecatedIsStillUsed"})
@Deprecated
@NonNull
private RequestManager fragmentGet(@NonNull Context context,
@NonNull android.app.FragmentManager fm,
@Nullable android.app.Fragment parentHint,
boolean isParentVisible) {
//得到我們自己的Fragment
RequestManagerFragment current = getRequestManagerFragment(fm, parentHint, isParentVisible);
RequestManager requestManager = current.getRequestManager();
if (requestManager == null) {
// TODO(b/27524013): Factor out this Glide.get() call.
Glide glide = Glide.get(context);
requestManager =
factory.build(
glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);
current.setRequestManager(requestManager);
}
return requestManager;
}
@SuppressWarnings("deprecation")
@NonNull
private RequestManagerFragment getRequestManagerFragment(
@NonNull final android.app.FragmentManager fm,
@Nullable android.app.Fragment parentHint,
boolean isParentVisible) {
//獲取該FragmentManager是否已經(jīng)有RequestManagerFragment
RequestManagerFragment current = (RequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG);
if (current == null) {
current = pendingRequestManagerFragments.get(fm);
if (current == null) {
current = new RequestManagerFragment();
current.setParentFragmentHint(parentHint);
if (isParentVisible) {
current.getGlideLifecycle().onStart();
}
pendingRequestManagerFragments.put(fm, current);
//添加到上下文,賦予該RequestManagerFragment生命周期
fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss();
//pendingRequestManagerFragments.remove(fm);
handler.obtainMessage(ID_REMOVE_FRAGMENT_MANAGER, fm).sendToTarget();
}
}
return current;
}
到此Glide.with(Activity)該請求已經(jīng)和傳入的activity生命周期綁定;
最后返回一個RequestManager對象,該對象時間在RequestManagerRetriever.supportFragmentGet()方法構(gòu)造出來
@NonNull
private RequestManager supportFragmentGet(
@NonNull Context context,
@NonNull FragmentManager fm,
@Nullable Fragment parentHint,
boolean isParentVisible) {
SupportRequestManagerFragment current =
getSupportRequestManagerFragment(fm, parentHint, isParentVisible);
RequestManager requestManager = current.getRequestManager();
if (requestManager == null) {
// TODO(b/27524013): Factor out this Glide.get() call.
Glide glide = Glide.get(context);
//這是就是給RequestManager構(gòu)造函數(shù)傳入?yún)?shù)
requestManager =
factory.build(
glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);
current.setRequestManager(requestManager);
}
return requestManager;
}
RequestManager.class
前面都是add,最后移除在RequestManager.class
@Override
public 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);
}
結(jié)束!