总述
这篇文章主要分析与Fragment生命周期的绑定,因为现在都是在Fragemnt里进行界面展示。之前在前两篇以及分析过Glide的加载过程和缓存的使用。这里就不进行分析了。
RequestManager关联Fragment生命周期
通过前面的文章,我们知道我们的请求的发起是在RequestManager中,即Glide.with(context).load(),那Glide我们Fragment周期的过程会暂停请求,或回复请求,肯定会跟他有关系。我们再次深入分析其构建过程
reqeustManager创建
这里以Glide.with(fragemnt)分析
- 根据我们传入的fragemnt,创建requestmanagerRetriever
- 然后去创建RequestManager
public static RequestManager with(@NonNull Fragment fragment) {
return getRetriever(fragment.getActivity()).
get(fragment);
}
这里我们看到创建requestmanagerRetriever是跟activity相关的,其会获取fragment绑定的activity
- 根据传入的fragment创建SupportRequestManagerFragment
- 然后将SupportRequestManagerFragment的ActivityFragmentLifecycle设置给RequestManager
public RequestManager get(@NonNull Fragment fragment) {
Preconditions.checkNotNull(fragment.getActivity(),
//如果在后台线程,则使用的时,applicationContext
if (Util.isOnBackgroundThread()) {
return get(fragment.getActivity().getApplicationContext());
} else {
//拿到传入的fragment的fragmentManager
FragmentManager fm = fragment.getChildFragmentManager();
return supportFragmentGet(fragment.getActivity(), fm, fragment, fragment.isVisible());
}
}
private RequestManager supportFragmentGet(
@NonNull Context context,
@NonNull FragmentManager fm,
@Nullable Fragment parentHint,
boolean isParentVisible) {
//创建SupportRequestManagerFragment
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
// 将创建的SupportRequestManagerFragment的
//ActivityFragmentLifecycle 传递给requestManager
requestManager =
factory.build(
glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);
current.setRequestManager(requestManager);
}
return requestManager;
}
总结
- 发现在requestmanager的创建过程其会首先生成一个SupportRequestManagerFragment
- 然后将SupportRequestManagerFragment与生命周期相关的ActivityFragmentLifecycle设置给RequestManager
SupportRequestManagerFragment
- 给类为fragment的子类
- 在其创建过程,将我们传递的fragment通过setParentFragmentHint 设置给它
private SupportRequestManagerFragment getSupportRequestManagerFragment(
@NonNull final FragmentManager fm, @Nullable Fragment parentHint, boolean isParentVisible) {
....
current = new SupportRequestManagerFragment();
current.setParentFragmentHint(parentHint);
if (isParentVisible) {
current.getGlideLifecycle().onStart();
}
.....
}
return current;
}
- setParentFragmentHint方法调用,将我们一开始传入的fragment作为创建的SupportRequestManagerFragment的父
void setParentFragmentHint(@Nullable Fragment parentFragmentHint) {
this.parentFragmentHint = parentFragmentHint;
if (parentFragmentHint != null && parentFragmentHint.getActivity() != null) {
registerFragmentWithRoot(parentFragmentHint.getActivity());
}
}
- 首先解绑之前注册的
- 然后使用我们通过Glide.with(fragemnt)设置的fragment的activity去获取rootRequestManagerFragment
- 判断与当前设置的是否一样
- 不一样,将新建的SupportRequestManagerFragment加入rootRequestManagerFragment
private void registerFragmentWithRoot(@NonNull FragmentActivity activity) {
unregisterFragmentWithRoot();
rootRequestManagerFragment =
Glide.get(activity).getRequestManagerRetriever().getSupportRequestManagerFragment(activity);
if (!equals(rootRequestManagerFragment)) {
rootRequestManagerFragment.addChildRequestManagerFragment(this);
}
}
- 其重写了onAttach方法
public void onAttach(Context context) {
super.onAttach(context);
try {
registerFragmentWithRoot(getActivity());
} catch (IllegalStateException e) {
// OnAttach can be called after the activity is destroyed, see #497.
if (Log.isLoggable(TAG, Log.WARN)) {
Log.w(TAG, "Unable to register fragment with root", e);
}
}
}
这里第二次进行绑定传递的为fragment所属的activity,是为了绑定activity的生命周期,当activity的生命周期回调时,其所属的所有fragment进行回调
- 这个RequestManagerFragment有可能是自身,有可能已经被初始化过了,比如是通过with(Activity activity)的方式初始化
ActivityFragmentLifecycle
- 创建SupportRequestManagerFragment时,创建其
public SupportRequestManagerFragment() {
this(new ActivityFragmentLifecycle());
}
- 其采用观察者设计模式
- 在调用addLister时,首先,先调用其start方法
- 后期在不同的生命周期,遍历注册的onserver,调用其响应的方法
public void addListener(@NonNull LifecycleListener listener) {
lifecycleListeners.add(listener);
if (isDestroyed) {
listener.onDestroy();
} else if (isStarted) {
listener.onStart();
} else {
listener.onStop();
}
}
void onStart() {
isStarted = true;
for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
lifecycleListener.onStart();
}
}
与fragment生命周期绑定
通过前面我们知道RequestManager在创建时,会设置SupportRequestManagerFragent的Lifecycle
- RequestManager 继承LifecycleListener
- requestManager构造方法中订阅LifeCycle
if (Util.isOnBackgroundThread()) {
mainHandler.post(addSelfToLifecycle);
} else {
lifecycle.addListener(this);
}
lifecycle.addListener(connectivityMonitor);
生命周期方法调用
前面我们知道创建RequestManager时,会与SupportRequestManagerFragment的Lifecycle绑定,而SupportRequestManagerFragment持有我们调用Glide时设置的Fragemnt,以及该Fragemnt的Activity的SupportRequestManagerFragment
绑定Fragment生命周期
- 在创建SupportRequestManagerFragment使用的fm为我们使用Glide.with(fragement)的childFragmentManager
FragmentManager fm = fragment.getChildFragmentManager();
return supportFragmentGet(fragment.getActivity(), fm, fragment, fragment.isVisible());
- 这样当我们fragment的生命周期调用时,会调用SupportRequestManagerFragment相应的生命周期,比如onStop
public void onStop() {
super.onStop();
lifecycle.onStop();
}
调用lifecycle的生命周期方法
- 然后lifecycle会调用所有注册的lifecyclelistener
- 我们知道其就是requestmanager
void onStop() {
isStarted = false;
for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
lifecycleListener.onStop();
}
}
调用requestmanager生命周期方法
- 在onStop时,其会暂停请求
*/
@Override
public synchronized void onStop() {
pauseRequests();
targetTracker.onStop();
}
public synchronized void pauseRequests() {
requestTracker.pauseRequests();
}
public void pauseRequests() {
isPaused = true;
for (Request request : Util.getSnapshot(requests)) {
if (request.isRunning()) {
request.clear();
pendingRequests.add(request);
}
}
}
到这里,Glide与Fragment的生命周期的关联已经很清晰了。但是创建SupportRequestManagerFragment时的parentFragent和rootRequestManagerFragment的作用是什么呢,他们做了什么,并没有看到?
- 这个主要时用于处理递归时的情况,比如frament中又嵌套frament,例如一个Activity采用Viewpager + Fragment的形式,而里面的Fragment又是一个ViewPager + Fragment的形式
- 我们在requestmanager会发现一个递归调用方法,会调用treeNode.getDescendants())
public synchronized void resumeRequestsRecursive() {
Util.assertMainThread();
resumeRequests();
for (RequestManager requestManager : treeNode.getDescendants()) {
requestManager.resumeRequests();
}
}
- 然后在里面其会判断,拿到其下面的requestfragment
- 在遍历过程,首先判断rootquestfragment是不是自己,如果是本身,返回childRequestFragments
- 如果不是,则会遍历,遍历中会调用getParentFragmentUsingHint,判断是不是给fragment的子类
Set<SupportRequestManagerFragment> getDescendantRequestManagerFragments() {
if (rootRequestManagerFragment == null) {
return Collections.emptySet();
} else if (equals(rootRequestManagerFragment)) {
return Collections.unmodifiableSet(childRequestManagerFragments);
} else {
Set<SupportRequestManagerFragment> descendants = new HashSet<>();
for (SupportRequestManagerFragment fragment : rootRequestManagerFragment
.getDescendantRequestManagerFragments()) {
if (isDescendant(fragment.getParentFragmentUsingHint())) {
descendants.add(fragment);
}
}
return Collections.unmodifiableSet(descendants);
}
private Fragment getParentFragmentUsingHint() {
Fragment fragment = getParentFragment();
return fragment != null ? fragment : parentFragmentHint;
}
总结
- Glide的请求通过requestmanager管理
- requestmanager创建时,会绑定一个requestfragment,该requestfragemnt为Glide.with(fragment)的儿子
- 同时requestmanager会持有requestframent的lificycle
- lificycle在构建requestfragment创建,为ActivityFragmentLifecycle
- 然后在进行请求或构建requestmanager时,会调用lifecycle.addListener,将自己作为observer添加进去,本身重写
LifecycleListener的onStart,onStop,onDestoy,暂停请求或回复请求