[关闭]
@ZeroGeek 2016-12-13T01:12:24.000000Z 字数 4142 阅读 1246

Glide是如何绑定生命周期的?

android


前言

前面我们讲了Glide的一个优点就是请求可以绑定Activity/Fragment的生命周期。onStart()时重新加载,在onStop()时暂停加载。
那么具体是怎么实现的呢?下面我们来一步步分析。

具体分析

  1. Glide.with(context).load(pngUrl).into(imageView);

看看Glide.with()方法

  1. public static RequestManager with(Activity activity) {
  2. RequestManagerRetriever retriever = RequestManagerRetriever.get();
  3. return retriever.get(activity);
  4. }

RequestManager是用来管理图片加载请求的。它实现了LifecycleListener接口。

  1. public interface LifecycleListener {
  2. void onStart();
  3. void onStop();
  4. void onDestroy();
  5. }

这个方法里面,onStart()会在Activity/Fragment的onStart()调用时被回调,onStop()在Activity/Fragment的onStop()调用时回调,onDestroy()在Activity/Fragment的onDestroy()调用时回调。(后面慢慢说明)

在RequestManager中对应实现如下:

  1. @Override
  2. public void onStart() {
  3. Util.assertMainThread();
  4. // 启动请求
  5. requestTracker.resumeRequests();
  6. }
  7. @Override
  8. public void onStop() {
  9. Util.assertMainThread();
  10. // 暂停请求
  11. requestTracker.pauseRequests();
  12. }
  13. @Override
  14. public void onDestroy() {
  15. // 清空请求
  16. requestTracker.clearRequests();
  17. }

onStart()和onStop()当然必须是要在UI线程,跟生命周期的执行一致。
RequestTracker是用来取消、启动请求的。

现在我们来看下RequestManagerRetriever,为什么要重新取一下

  1. // 对应上面的 return retriever.get(activity);
  2. @TargetApi(Build.VERSION_CODES.HONEYCOMB)
  3. public RequestManager get(Activity activity) {
  4. if (Util.isOnBackgroundThread() || Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
  5. return get(activity.getApplicationContext());
  6. } else {
  7. assertNotDestroyed(activity);
  8. // 关键获取了这个Activity的FragmentManager
  9. android.app.FragmentManager fm = activity.getFragmentManager();
  10. return fragmentGet(activity, fm);
  11. }
  12. }

首先我们获取到了这个Activity的FragmentManager,再看fragmentget();

  1. @TargetApi(Build.VERSION_CODES.HONEYCOMB)
  2. RequestManager fragmentGet(Context context, android.app.FragmentManager fm) {
  3. // 通过RequestManagerFragment,绑定到Activity上
  4. RequestManagerFragment current = getRequestManagerFragment(fm);
  5. // 生成已经绑定生命周期的RequsetManager
  6. RequestManager requestManager = current.getRequestManager();
  7. if (requestManager == null) {
  8. requestManager = new RequestManager(context, current.getLifecycle(), current.getRequestManagerTreeNode());
  9. current.setRequestManager(requestManager);
  10. }
  11. return requestManager;
  12. }

然后通过生成一个特定的Fragment去依附Activity,完成生命周期的绑定

  1. @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
  2. RequestManagerFragment getRequestManagerFragment(final android.app.FragmentManager fm) {
  3. RequestManagerFragment current = (RequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG);
  4. if (current == null) {
  5. current = pendingRequestManagerFragments.get(fm);
  6. if (current == null) {
  7. // 实例化RequestManagerFragment
  8. current = new RequestManagerFragment();
  9. pendingRequestManagerFragments.put(fm, current);
  10. // 完成生命周期绑定
  11. fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss();
  12. handler.obtainMessage(ID_REMOVE_FRAGMENT_MANAGER, fm).sendToTarget();
  13. }
  14. }
  15. return current;
  16. }

再看RequestManagerFragment的实现

  1. public RequestManagerFragment() {
  2. this(new ActivityFragmentLifecycle());
  3. }
  4. // For testing only.
  5. @SuppressLint("ValidFragment")
  6. RequestManagerFragment(ActivityFragmentLifecycle lifecycle) {
  7. this.lifecycle = lifecycle;
  8. }

ActivityFragmentLifecycle用来对Activity的生命周期函数进行跟踪和通知

  1. class ActivityFragmentLifecycle implements Lifecycle {
  2. private final Set<LifecycleListener> lifecycleListeners =
  3. Collections.newSetFromMap(new WeakHashMap<LifecycleListener, Boolean>());
  4. private boolean isStarted;
  5. private boolean isDestroyed;
  6. @Override
  7. public void addListener(LifecycleListener listener) {
  8. lifecycleListeners.add(listener);
  9. if (isDestroyed) {
  10. listener.onDestroy();
  11. } else if (isStarted) {
  12. listener.onStart();
  13. } else {
  14. listener.onStop();
  15. }
  16. }
  17. void onStart() {
  18. isStarted = true;
  19. for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
  20. lifecycleListener.onStart();
  21. }
  22. }
  23. void onStop() {
  24. isStarted = false;
  25. for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
  26. lifecycleListener.onStop();
  27. }
  28. }
  29. void onDestroy() {
  30. isDestroyed = true;
  31. for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
  32. lifecycleListener.onDestroy();
  33. }
  34. }
  35. }

前面我们讲过RequestManager实现了LifecycleListener。这里用了Set集合存储RequestManager。

再回到RequestManagerFragment

  1. @Override
  2. public void onStart() {
  3. super.onStart();
  4. lifecycle.onStart();
  5. }
  6. @Override
  7. public void onStop() {
  8. super.onStop();
  9. lifecycle.onStop();
  10. }
  11. @Override
  12. public void onDestroy() {
  13. super.onDestroy();
  14. lifecycle.onDestroy();
  15. }

生命周期真正的回调,对应执行了RequestManager的回调。
还有许多细节就需要自己去探索了,相信你也大半懂了基本原理。

小结

关键在于获取Activity的FragmentManager(另外还支持support.v4中的FragmentManager类,这也是为什么要依赖这个包),生成特定的Fragment去依附Activity,监听到生命周期函数。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注