RequestManager实现了LifecycleListener接口,来感知生命周期,实现intelligently “智能”管理请求。
1. Glide.with(…)
有若干多态方法,以下面方法举例。
Glide.with(activity)
public static RequestManager with(@NonNull Activity activity) {
return getRetriever(activity).get(activity);
}
RequestManagerRetriever#get(activity)
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));
}
}
- 子线程中调用with,则Glide图片加载到生命周期与Application绑定;
- 否则,图片加载到生命周期与Activity/Fragment绑定。
2. fragmentGet(…)
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;
}
public class RequestManagerFragment extends Fragment {
private static final String TAG = "RMFragment";
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();
unregisterFragmentWithRoot();
}
}
这里举例用Glide.with(activity)举例:
Glide内部会与一个无界面的Fragment进行绑定,这样RequestManager可以感知Fragment的生命周期,可以有效管理请求。
用户无需关系此细节,降低使用成本,防止内存泄漏。