上一篇博客中我们主要介绍了Glide调用的流程,涉及的类还有方法我在交互图中做了详细的介绍,这篇呢我们来介绍一下Glide的生命周期。本来我打算在博客中详细的写出每个类和每个过程,但是涉及的篇幅实在的太多了,所以之后的博客还是以思想为主,具体的源代码我会直接提供出来,当然有不懂的地方可以随时留言提问。
1.生命周期的监控
Glide是如何实现载体生命周期的监控的呢?其实思想和简单,就是在载体(Activity或Fragment)中插入一个新的Fragment,Fragment本身就是带有生命周期的,把这个新的Fragment和载体进行绑定,实现一个联动的效果,这样就能清楚的知道载体的生命周期,从而进行资源的加载和释放。
插入的新Fragment在Glide中是SupportRequestManagerFragment,这个类继承了Fragment;而SupportRequestManagerFragment这个类的创建实在RequestManagerRetriever这个类中,代码如下(下面是阉割版Glide中的源码):
private Map<FragmentManager, SupportRequestManagerFragment> supports = new HashMap<>();
/**
* 获得Fragment
* @param fm
* @return
*/
private SupportRequestManagerFragment getSupportRequestManagerFragment(FragmentManager fm) {
SupportRequestManagerFragment fragment = (SupportRequestManagerFragment) fm.findFragmentByTag(FRAG_TAG);
if (null == fragment) {
fragment = supports.get(fm);
if (null == fragment) {
fragment = new SupportRequestManagerFragment();
//先加入集合
supports.put(fm, fragment);
fm.beginTransaction().add(fragment, FRAG_TAG).commitAllowingStateLoss();
handler.obtainMessage(REMOVE_SUPPORT_FRAGMENT, fm).sendToTarget();
}
}
return fragment;
}
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case REMOVE_SUPPORT_FRAGMENT:
FragmentManager fm = (FragmentManager) msg.obj;
supports.remove(fm);
break;
}
return false;
}
我们稍后来看这个方法是在哪里调用的,其他的我们先不管,主要来看一下Glide是如何处理这个Fragment的。
方法传入的参数FragmentManager是在载体中拿到的,首先从fm中通过tag来获取SupportRequestManagerFragment,因为第一次获取,所以fragment肯定是null。supports是一个集合,key是FragmentManager,其实就是载体;value是创建的SupportRequestManagerFragment。作用显而易见,就是判断是否创建了SupportRequestManagerFragment。所以呢上述的代码中,从第一次懂supports中获取的SupportRequestManagerFragment依然是null。之后会创建一个新的SupportRequestManagerFragment,然后放入到supports这个集合中。通过add和commit方法和载体进行绑定。最让人迷惑的是if中最后一句代码:通过handler,又把supports中刚刚加入的SupportRequestManagerFragment给移除了?这是为什么呢?
首先,我们要知道supports这个集合的作用是什么,supports的作用就是防止SupportRequestManagerFragment重复创建。那SupportRequestManagerFragment什么时候会重复创建呢?当Glide在Activity的onCreate方法中使用两次的时候,如果没有这个supports会导致SupportRequestManagerFragment创建两次。原因如下:
第一步:Activity执行onCreate的时候,主线程的Handler会发送一个Message,加入到消息队列中,等待被执行,我们命名为m1
第二步:Glide第一次在onCreate中进行图片的加载,载体和SupportRequestManagerFragment之间进行绑定的时候(执行commit或者commitAllowingStateLoss),主线程的Handler也会发送一个Message到消息队列中,等待被执行,我们命名为m2。此时m1正在被执行,还没有执行完,所以载体和SupportRequestManagerFragment之间并没有绑定成功
第三步:Glide第二次在onCreate中进行图片的加载,通过fm.findFragmentByTag进行查找,此时m2没有执行,所以载体和SupportRequestManagerFragment之间没有绑定成功,获得的SupportRequestManagerFragment依然是null,如果此时没有supports的话,会重新创建一个新的SupportRequestManagerFragment,导致重复创建
2.RequestMananger
上面说了很多,那getSupportRequestManagerFragment这个方法到底是在哪里调用的呢?我们看源码:
private RequestManager supportFragmentGet(FragmentManager fm) {
//从frgamentmanager中查找RequestManagerFragment
SupportRequestManagerFragment fragment = getSupportRequestManagerFragment(fm);
// 将RequestManager交给 Frgament 来保存
RequestManager requestManager = fragment.getRequestManager();
if (null == requestManager) {
requestManager = new RequestManager(fragment.getGlideLifecycle());
fragment.setRequestManager(requestManager);
}
return requestManager;
}
在RequestManagerRetriever调用了很多的方法,从这个方法中我们可以看出来,最终的目的其实就是获取这个RequestManager。上面说道,我们通过创建一个新的Fragment和载体绑定,从而使Glide具有了生命周期,而这个RequestManager呢就是对生命周期的监听。RequestManager实现了LifecycleListener接口,LifecycleListener这个接口如下:
public interface LifecycleListener {
void onStart();
void onStop();
void onDestroy();
}
每个RequestManager都和SupportRequestManagerFragment进行绑定,从而监听Fragment的生命周期。还有一个接口Lifecycle和实现类ActivityFragmentLifecycle,他们主要负责RequestManager的管理。代码如下:
public interface Lifecycle {
void addListener(LifecycleListener listener);
void removeListener(LifecycleListener listener);
}
/**
* 生命周期监听管理器
*/
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(LifecycleListener listener) {
lifecycleListeners.add(listener);
if (isDestroyed) {
listener.onDestroy();
} else if (isStarted) {
listener.onStart();
} else {
listener.onStop();
}
}
@Override
public void removeListener(LifecycleListener listener) {
lifecycleListeners.remove(listener);
}
void onStart() {
isStarted = true;
for (LifecycleListener lifecycleListener : lifecycleListeners) {
lifecycleListener.onStart();
}
}
void onStop() {
isStarted = false;
for (LifecycleListener lifecycleListener : lifecycleListeners) {
lifecycleListener.onStop();
}
}
void onDestroy() {
isDestroyed = true;
for (LifecycleListener lifecycleListener : lifecycleListeners) {
lifecycleListener.onDestroy();
}
}
}
ActivityFragmentLifecycle这个类会在SupportRequestManagerFragment的构造函数中被创建
public SupportRequestManagerFragment() {
lifecycle = new ActivityFragmentLifecycle();
}
Fragment在执行相应的生命周期的时候,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();
}
在ActivityFragmentLifecycle中对应的方法如下:
void onStart() {
isStarted = true;
for (LifecycleListener lifecycleListener : lifecycleListeners) {
lifecycleListener.onStart();
}
}
void onStop() {
isStarted = false;
for (LifecycleListener lifecycleListener : lifecycleListeners) {
lifecycleListener.onStop();
}
}
void onDestroy() {
isDestroyed = true;
for (LifecycleListener lifecycleListener : lifecycleListeners) {
lifecycleListener.onDestroy();
}
}
也就是遍历所有的监听,执行相应onStart,onStop,onDestory方法
Glide的生命周期就是如此实现的,欢迎大家提问和纠错!