Glide
Glide,它的with()方法有四、五個重載,分別可以傳入Context、Activity、FragmentActivity、v4包下的Fragment和app包下的Fragment。雖然有五種重載,但是最后只有兩種情況,即傳入Application類型的參數(shù),和傳入非Application類型的參數(shù)。
傳入Application的話,Glide的生命周期就和應用程序一樣了。應用程序退出,Glide就停止加載任務。
如果傳入的是非Application的話,比如說Fragment、Activity,Glide會在對應Activity發(fā)生重要生命周期回調(diào)的時候?qū)θ蝿者M行相應的處理,比如說在Activity.onDestroy()發(fā)生的時候,Glide就對在這個Activity里產(chǎn)生的任務進行停止處理。避免資源的浪費。
如何做到的呢?其實Glide是往當前的Activity當中添加一個隱藏的Fragment,因為Fragment的生命周期和Activity是同步的,所以這個Fragment就能夠?qū)ι芷诨卣{(diào)進行處理了。
看一下這個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();
}
.
.
.
}
使用了回調(diào)通知了具體的監(jiān)聽類。看一下這個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里定義的生命周期監(jiān)聽接口,可以看到監(jiān)聽了onStart()、onStop()和onDestroy()這三種情況。
Glide的RequestManager類實現(xiàn)了這個接口,
public class RequestManager implements LifecycleListener
我們看一下它的實現(xiàn):
@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對任務進行了調(diào)度、取消等處理。