Glide
Glide,它的with()方法有四、五个重载,分别可以传入Context、Activity、FragmentActivity、v4包下的Fragment和app包下的Fragment。虽然有五种重载,但是最后只有两种情况,即传入Application类型的参数,和传入非Application类型的参数。
传入Application的话,Glide的生命周期就和应用程序一样了。应用程序退出,Glide就停止加载任务。
如果传入的是非Application的话,比如说Fragment、Activity,Glide会在对应Activity发生重要生命周期回调的时候对任务进行相应的处理,比如说在Activity.onDestroy()发生的时候,Glide就对在这个Activity里产生的任务进行停止处理。避免资源的浪费。
如何做到的呢?其实Glide是往当前的Activity当中添加一个隐藏的Fragment,因为Fragment的生命周期和Activity是同步的,所以这个Fragment就能够对生命周期回调进行处理了。
看一下这个Fragment:
public class RequestManagerFragment extends Fragment {
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();
}
.
.
.
}
使用了回调通知了具体的监听类。看一下这个LifecycleListener:
/**
* An interface for listener to {@link android.app.Fragment} and {@link android.app.Activity} lifecycle events.
*/
public interface LifecycleListener {
/**
* Callback for when {@link android.app.Fragment#onStart()}} or {@link android.app.Activity#onStart()} is called.
*/
void onStart();
/**
* Callback for when {@link android.app.Fragment#onStop()}} or {@link android.app.Activity#onStop()}} is called.
*/
void onStop();
/**
* Callback for when {@link android.app.Fragment#onDestroy()}} or {@link android.app.Activity#onDestroy()} is
* called.
*/
void onDestroy();
}
这是Glide里定义的生命周期监听接口,可以看到监听了onStart()、onStop()和onDestroy()这三种情况。
Glide的RequestManager类实现了这个接口,
public class RequestManager implements LifecycleListener
我们看一下它的实现:
@Override
public void onStart() {
// onStart might not be called because this object may be created after the fragment/activity's onStart method.
resumeRequests();
}
/**
* Lifecycle callback that unregisters for connectivity events (if the android.permission.ACCESS_NETWORK_STATE
* permission is present) and pauses in progress loads.
*/
@Override
public void onStop() {
pauseRequests();
}
/**
* Lifecycle callback that cancels all in progress requests and clears and recycles resources for all completed
* requests.
*/
@Override
public void onDestroy() {
requestTracker.clearRequests();
}
就是在这里Glide对任务进行了调度、取消等处理。