@ZeroGeek
2016-12-13T01:12:24.000000Z
字数 4142
阅读 1343
android
前面我们讲了Glide的一个优点就是请求可以绑定Activity/Fragment的生命周期。onStart()时重新加载,在onStop()时暂停加载。
那么具体是怎么实现的呢?下面我们来一步步分析。
Glide.with(context).load(pngUrl).into(imageView);
看看Glide.with()方法
public static RequestManager with(Activity activity) {
RequestManagerRetriever retriever = RequestManagerRetriever.get();
return retriever.get(activity);
}
RequestManager是用来管理图片加载请求的。它实现了LifecycleListener接口。
public interface LifecycleListener {
void onStart();
void onStop();
void onDestroy();
}
这个方法里面,onStart()会在Activity/Fragment的onStart()调用时被回调,onStop()在Activity/Fragment的onStop()调用时回调,onDestroy()在Activity/Fragment的onDestroy()调用时回调。(后面慢慢说明)
在RequestManager中对应实现如下:
@Override
public void onStart() {
Util.assertMainThread();
// 启动请求
requestTracker.resumeRequests();
}
@Override
public void onStop() {
Util.assertMainThread();
// 暂停请求
requestTracker.pauseRequests();
}
@Override
public void onDestroy() {
// 清空请求
requestTracker.clearRequests();
}
onStart()和onStop()当然必须是要在UI线程,跟生命周期的执行一致。
RequestTracker是用来取消、启动请求的。
现在我们来看下RequestManagerRetriever,为什么要重新取一下
// 对应上面的 return retriever.get(activity);
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public RequestManager get(Activity activity) {
if (Util.isOnBackgroundThread() || Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
return get(activity.getApplicationContext());
} else {
assertNotDestroyed(activity);
// 关键获取了这个Activity的FragmentManager
android.app.FragmentManager fm = activity.getFragmentManager();
return fragmentGet(activity, fm);
}
}
首先我们获取到了这个Activity的FragmentManager,再看fragmentget();
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
RequestManager fragmentGet(Context context, android.app.FragmentManager fm) {
// 通过RequestManagerFragment,绑定到Activity上
RequestManagerFragment current = getRequestManagerFragment(fm);
// 生成已经绑定生命周期的RequsetManager
RequestManager requestManager = current.getRequestManager();
if (requestManager == null) {
requestManager = new RequestManager(context, current.getLifecycle(), current.getRequestManagerTreeNode());
current.setRequestManager(requestManager);
}
return requestManager;
}
然后通过生成一个特定的Fragment去依附Activity,完成生命周期的绑定
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
RequestManagerFragment getRequestManagerFragment(final android.app.FragmentManager fm) {
RequestManagerFragment current = (RequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG);
if (current == null) {
current = pendingRequestManagerFragments.get(fm);
if (current == null) {
// 实例化RequestManagerFragment
current = new RequestManagerFragment();
pendingRequestManagerFragments.put(fm, current);
// 完成生命周期绑定
fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss();
handler.obtainMessage(ID_REMOVE_FRAGMENT_MANAGER, fm).sendToTarget();
}
}
return current;
}
再看RequestManagerFragment的实现
public RequestManagerFragment() {
this(new ActivityFragmentLifecycle());
}
// For testing only.
@SuppressLint("ValidFragment")
RequestManagerFragment(ActivityFragmentLifecycle lifecycle) {
this.lifecycle = lifecycle;
}
ActivityFragmentLifecycle用来对Activity的生命周期函数进行跟踪和通知
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();
}
}
void onStart() {
isStarted = true;
for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
lifecycleListener.onStart();
}
}
void onStop() {
isStarted = false;
for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
lifecycleListener.onStop();
}
}
void onDestroy() {
isDestroyed = true;
for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
lifecycleListener.onDestroy();
}
}
}
前面我们讲过RequestManager实现了LifecycleListener。这里用了Set集合存储RequestManager。
再回到RequestManagerFragment
@Override
public void onStart() {
super.onStart();
lifecycle.onStart();
}
@Override
public void onStop() {
super.onStop();
lifecycle.onStop();
}
@Override
public void onDestroy() {
super.onDestroy();
lifecycle.onDestroy();
}
生命周期真正的回调,对应执行了RequestManager的回调。
还有许多细节就需要自己去探索了,相信你也大半懂了基本原理。
关键在于获取Activity的FragmentManager(另外还支持support.v4中的FragmentManager类,这也是为什么要依赖这个包),生成特定的Fragment去依附Activity,监听到生命周期函数。