Glide系列 -- 与Activity关联关系

分析版本为glide:4.9.0

时序图


Glide与Activity生命周期相关联

with方法

  • with(Context context)
  • with(Activity activity)
  • with(FragmentActivity activity)
  • with(android.app.Fragment fragment)
  • with(Fragment fragment)// v4包下
  • with(View view)

所有这些with方法,首先都会根据传入的值获取到ApplicationContext,生成Glide对象,并获取RequestManagerRetriever对象

根据代码分析下

首先得到Glide对象 --initializeGlide(@NonNull Context context, @NonNull GlideBuilder builder)方法

 @SuppressWarnings("deprecation")
  private static void initializeGlide(@NonNull Context context, @NonNull GlideBuilder builder) {
    // with方法根据不同的传值获取其上下文 获取到全局的上下文
    Context applicationContext = context.getApplicationContext();
    // 获取注解GlideModule的类 如果没有自定义的GlideModule则,返回null
    GeneratedAppGlideModule annotationGeneratedModule = getAnnotationGeneratedGlideModules();
    List<com.bumptech.glide.module.GlideModule> manifestModules = Collections.emptyList();
    // 获取AndroidManifest.xml中meta-data中配置的GlideModule
    if (annotationGeneratedModule == null || annotationGeneratedModule.isManifestParsingEnabled()) {
      manifestModules = new ManifestParser(applicationContext).parse();
    }
    // 删除manifestModules中与注解GlideModule重复的module
    if (annotationGeneratedModule != null
        && !annotationGeneratedModule.getExcludedModuleClasses().isEmpty()) {
      Set<Class<?>> excludedModuleClasses =
          annotationGeneratedModule.getExcludedModuleClasses();
      Iterator<com.bumptech.glide.module.GlideModule> iterator = manifestModules.iterator();
      while (iterator.hasNext()) {
        com.bumptech.glide.module.GlideModule current = iterator.next();
        if (!excludedModuleClasses.contains(current.getClass())) {
          continue;
        }
        if (Log.isLoggable(TAG, Log.DEBUG)) {
          Log.d(TAG, "AppGlideModule excludes manifest GlideModule: " + current);
        }
        iterator.remove();
      }
    }
    ... // 输出log,无关代码
    // 获取RequestManagerFactory对象 如果没有自定义的GlideModule则为null
    RequestManagerRetriever.RequestManagerFactory factory =
        annotationGeneratedModule != null
            ? annotationGeneratedModule.getRequestManagerFactory() : null;
    builder.setRequestManagerFactory(factory);
    for (com.bumptech.glide.module.GlideModule module : manifestModules) {
      module.applyOptions(applicationContext, builder);
    }
    if (annotationGeneratedModule != null) {
      annotationGeneratedModule.applyOptions(applicationContext, builder);
    }
    // 生成Glide对象
    Glide glide = builder.build(applicationContext);
    for (com.bumptech.glide.module.GlideModule module : manifestModules) {
      module.registerComponents(applicationContext, glide, glide.registry);
    }
    if (annotationGeneratedModule != null) {
      annotationGeneratedModule.registerComponents(applicationContext, glide, glide.registry);
    }
    applicationContext.registerComponentCallbacks(glide);
    Glide.glide = glide;
  }

第二步,获取RequestManagerRetriever对象
这步很简单,我们在生成Glide对象的时候就已经生成的RequestManagerRetriever对象
GlideBuilder的build方法

...
// 根据上面分析,我们如果没有写自定义GlideModule方法,requestManagerFactory为null
 RequestManagerRetriever requestManagerRetriever =
        new RequestManagerRetriever(requestManagerFactory);
 return new Glide(
        context,
        engine,
        memoryCache,
        bitmapPool,
        arrayPool,
        requestManagerRetriever,
        connectivityMonitorFactory,
        logLevel,
        defaultRequestOptions.lock(),
        defaultTransitionOptions,
        defaultRequestListeners,
        isLoggingRequestOriginsEnabled);
  }

RequestManagerRetriever.java

public RequestManagerRetriever(@Nullable RequestManagerFactory factory) {
    // 如果factory为空,使用默认的RequestManagerFactory
    this.factory = factory != null ? factory : DEFAULT_FACTORY;
    // 此处,我觉得很重要
    handler = new Handler(Looper.getMainLooper(), this /* Callback */);
  }

第三步,获取RequestManager对象

根据我们调用with方法传入的对象获取RequestManager对象

如果当前是后台线程,直接获取ApplicationContext处理

我们先来分析在当前UI线程

 @NonNull
  public RequestManager get(@NonNull Activity activity) {
    if (Util.isOnBackgroundThread()) {
      return get(activity.getApplicationContext());
    } else {
      assertNotDestroyed(activity);
      android.app.FragmentManager fm = activity.getFragmentManager();
      return fragmentGet(
          activity, fm, /*parentHint=*/ null, isActivityVisible(activity));
    }
  }
@Deprecated
  @NonNull
  private RequestManager fragmentGet(@NonNull Context context,
      @NonNull android.app.FragmentManager fm,
      @Nullable android.app.Fragment parentHint,
      boolean isParentVisible) {
      // 获取RequestManagerFragment
    RequestManagerFragment current = getRequestManagerFragment(fm, parentHint, isParentVisible);
    // 获取fragment中的requestManager
    RequestManager requestManager = current.getRequestManager();
    if (requestManager == null) {
      // TODO(b/27524013): Factor out this Glide.get() call.
      Glide glide = Glide.get(context);
      // 如果没有,则新建一个,并设置到fragment中
      // factory 如果我们没有自定的module设置的话,使用的是默认的factory
      requestManager =
          factory.build(
              glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);
      current.setRequestManager(requestManager);
    }
    return requestManager;
  }

获取RequestManagerFragment

 @NonNull
  private RequestManagerFragment getRequestManagerFragment(
      @NonNull final android.app.FragmentManager fm,
      @Nullable android.app.Fragment parentHint,
      boolean isParentVisible) {
      // 先从FragmentManager中找看是否已经存在该fragment
    RequestManagerFragment current = (RequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG);
    if (current == null)
    // 如果没有,则从我们自己的Map中找
      current = pendingRequestManagerFragments.get(fm);
      if (current == null) {
        // 如果都没有,则新建一个fragment 
        current = new RequestManagerFragment();
        current.setParentFragmentHint(parentHint);
        // 如果当前Activity没有isFinishing则isParentVisible为true
        if (isParentVisible) {
            // 触发lifecycle的onStart方法
          current.getGlideLifecycle().onStart();
        }
        //放入自己的map中
        pendingRequestManagerFragments.put(fm, current);
        // 开启事物,加tag 显示fragment
        fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss();
        handler.obtainMessage(ID_REMOVE_FRAGMENT_MANAGER, fm).sendToTarget();
      }
    }
    return current;
  }

获取requestManager对象 最终调用RequestManager的构造方法

RequestManager(
      Glide glide,
      Lifecycle lifecycle,
      RequestManagerTreeNode treeNode,
      RequestTracker requestTracker,
      ConnectivityMonitorFactory factory,
      Context context) {
    this.glide = glide;
    // lifecycle 为fragment中的ActivityFragmenLifecycle对象
    this.lifecycle = lifecycle;
    this.treeNode = treeNode;
    // 请求追踪器  requestTracker = new RequestTracker()
    this.requestTracker = requestTracker;
    this.context = context;
    // 连接的监听器
    connectivityMonitor =
        factory.build(
            context.getApplicationContext(),
            new RequestManagerConnectivityListener(requestTracker));

    // If we're the application level request manager, we may be created on a background thread.
    // In that case we cannot risk synchronously pausing or resuming requests, so we hack around the
    // issue by delaying adding ourselves as a lifecycle listener by posting to the main thread.
    // This should be entirely safe.
    if (Util.isOnBackgroundThread()) {
      mainHandler.post(addSelfToLifecycle);
    } else {
        // 如果不是后台线程,则添加listener
      lifecycle.addListener(this);
    }
    // 添加连接监听器
    lifecycle.addListener(connectivityMonitor);

    defaultRequestListeners =
        new CopyOnWriteArrayList<>(glide.getGlideContext().getDefaultRequestListeners());
    setRequestOptions(glide.getGlideContext().getDefaultRequestOptions());
    
    // 把requestManager注册到glide中
    glide.registerRequestManager(this);
  }

当我们所在的Activity执行onStop()方法之后,所关联的fragment也会执行onStop()方法

RequestManagerFragment.java

public void onStop() {
    super.onStop();
    // lifecycle为ActivityFragmentLifecycle
    lifecycle.onStop();
  }

ActivityFragmentLifecycle.java

void onStop() {
    isStarted = false;
    //迭代注册的listener 执行onStop方法
    // 一个listener为RequestManager
    // 一个为connectivityMonitor
    for (LifecycleListener lifecycleListener : Util.getSnapshot(lifecycleListeners)) {
      lifecycleListener.onStop();
    }
  }

RequestManager.java

public synchronized void onStop() {
    pauseRequests();
    targetTracker.onStop();
  }
  
  public synchronized void pauseRequests() {
    // requestTracker 为RequestTracker对象 在RequestManager构造函数中创建
    requestTracker.pauseRequests();
  }

RequestTracker.java

/**
   * Stops any in progress requests. 停止任何正在进行的请求
   */
public void pauseRequests() {
    isPaused = true;
    for (Request request : Util.getSnapshot(requests)) {
      if (request.isRunning()) {
        request.clear();
        // 将请求加入list
        pendingRequests.add(request);
      }
    }
  }

到此,页面onStop后,Glide不在加载

同理 页面onStart()恢复之后
RequestTracker.java

/**
   * Starts any not yet completed or failed requests. 
   * 开始没有完成或者失败的请求
   */
  public void resumeRequests() {
    isPaused = false;
    for (Request request : Util.getSnapshot(requests)) {
      // We don't need to check for cleared here. Any explicit clear by a user will remove the
      // Request from the tracker, so the only way we'd find a cleared request here is if we cleared
      // it. As a result it should be safe for us to resume cleared requests.
      if (!request.isComplete() && !request.isRunning()) {
        request.begin();
      }
    }
    // 清空列表
    pendingRequests.clear();
  }

onDestory()

/**
   * Lifecycle callback that cancels all in progress requests and clears and recycles resources for
   * all completed requests.
   * 清空所有的请求,glide与RequestManager解除关系
   */
  @Override
  public synchronized void onDestroy() {
    targetTracker.onDestroy();
    for (Target<?> target : targetTracker.getAll()) {
      clear(target);
    }
    targetTracker.clear();
    requestTracker.clearRequests();
    lifecycle.removeListener(this);
    lifecycle.removeListener(connectivityMonitor);
    mainHandler.removeCallbacks(addSelfToLifecycle);
    glide.unregisterRequestManager(this);
  }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353