通过查看glide的源码,我们知道glide是通过传入的context的生命周期来管理资源请求的生命周期的,那么glide是如何一步步实现的呢?接下来我们来分析一下。
首先,我们来看一下glide的用法
GlideApp
.with(context)
.load(url)
.centerCrop()
.placeholder(R.drawable.loading_spinner)
.into(myImageView);
通过上面使用代码,我们注意到是通过with方法把contex对象传进去的,那么我们来看一下with方法
public static RequestManager with(@NonNull Activity activity) {
return getRetriever(activity).get(activity);
}
此处先获取了 RequestManagerRetriever 对象,然后通过get方法获取 RequestManager,看一下get方法的实现
@NonNull
public RequestManager get(@NonNull Context context) {
if (context == null) {
throw new IllegalArgumentException("You cannot start a load on a null Context");
} 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) {
return get(((ContextWrapper) context).getBaseContext());
}
}
return getApplicationManager(context);
}
此处分了几种情况,我们注重分析activity的情况,非全局context的情况是类似的
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));
}
}
private RequestManager fragmentGet(@NonNull Context context,
@NonNull android.app.FragmentManager fm,
@Nullable android.app.Fragment parentHint,
boolean isParentVisible) {
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;
}
private RequestManagerFragment getRequestManagerFragment(
@NonNull final android.app.FragmentManager fm,
@Nullable android.app.Fragment parentHint,
boolean isParentVisible) {
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);
fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss();
handler.obtainMessage(ID_REMOVE_FRAGMENT_MANAGER, fm).sendToTarget();
}
}
return current;
}
通过activity获取到了FragmentManager,通过FragmentManager获取到RequestManagerFragment,RequestManagerFragment继承自Fragment,生命周期依赖于context,而RequestManager的生命周期依赖于RequestManagerFragment。
RequestManager是生命周期是如何依赖RequestManagerFragment,下面我们着重分析一下。
在fragmentGet方法中,创建RequestManager时传进去一个生命周期参数RequestManagerFragment.getGlideLifecycler(),在RequestManager中,使用了该参数,lifecycle.addListener(this),RequestManager本身实现了LifecycleListener接口,而addListener方法实质是调用了ActivityFragmentLifecycle.addListener,RequestManagerFragment中持有一个ActivityFragmentLifecycle对象,而这个对象就是传入RequestManager中的lifecycle对象,由此生命周期的管理便关联上了,由context生命周期变化而引起RequestManager的生命周期变化过程如下:
context -> RequestManagerFragment -> ActivityFragmentLifecycle -> LifecycleListener(即RequestManager)
下面是上述过程中的关键代码
//RequestManagerFragment.java
public class RequestManagerFragment extends Fragment {
private final ActivityFragmentLifecycle lifecycle;
@Override
public void onStart() {
//context的生命周期会回调到此fragment,而此处回回调到ActivityFragmentLifecycle 的生命周期
super.onStart();
lifecycle.onStart();
}
@Override
public void onStop() {
super.onStop();
lifecycle.onStop();
}
}
//ActivityFragmentLifecycle.java
class ActivityFragmentLifecycle implements Lifecycle {
private final Set<LifecycleListener> lifecycleListeners =
Collections.newSetFromMap(new WeakHashMap<LifecycleListener, Boolean>());
@Override
public void addListener(@NonNull LifecycleListener listener) {
lifecycleListeners.add(listener);
if (isDestroyed) {
listener.onDestroy();
} else if (isStarted) {
listener.onStart();
} else {
listener.onStop();
}
}
void onStart() {
//此处的lifecycleListener中包含了RequestManager,所以此处会回调到RequestManager的几个回调方法
isStarted = true;
for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
lifecycleListener.onStart();
}
}
void onStop() {
isStarted = false;
for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
lifecycleListener.onStop();
}
}
}
//RequestManager.java
public class RequestManager implements LifecycleListener{
//此处的lifecycle 即 ActivityFragmentLifecycle
final Lifecycle lifecycle;
lifecycle.addListener(RequestManager.this);
public void onStart() {
//此处做请求的生命周期操作
//resume所有请求
resumeRequests();
//resume所有View
targetTracker.onStart();
}
public void onStop() {
//stop所有请求
pauseRequests();
//stop所有view
targetTracker.onStop();
}
}