@ZeroGeek
2016-12-13T01:12:24.000000Z
字数 4142
阅读 1442
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中对应实现如下:
@Overridepublic void onStart() {Util.assertMainThread();// 启动请求requestTracker.resumeRequests();}@Overridepublic void onStop() {Util.assertMainThread();// 暂停请求requestTracker.pauseRequests();}@Overridepublic 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的FragmentManagerandroid.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);// 生成已经绑定生命周期的RequsetManagerRequestManager 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) {// 实例化RequestManagerFragmentcurrent = 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;@Overridepublic 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
@Overridepublic void onStart() {super.onStart();lifecycle.onStart();}@Overridepublic void onStop() {super.onStop();lifecycle.onStop();}@Overridepublic void onDestroy() {super.onDestroy();lifecycle.onDestroy();}
生命周期真正的回调,对应执行了RequestManager的回调。
还有许多细节就需要自己去探索了,相信你也大半懂了基本原理。
关键在于获取Activity的FragmentManager(另外还支持support.v4中的FragmentManager类,这也是为什么要依赖这个包),生成特定的Fragment去依附Activity,监听到生命周期函数。