前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Glide生命周期管理

Glide生命周期管理

作者头像
提莫队长
发布2018-05-18 15:20:15
9100
发布2018-05-18 15:20:15
举报
文章被收录于专栏:刘晓杰刘晓杰

Glide.with里面有这段代码

代码语言:javascript
复制
public RequestManager get(Activity activity) {
        if (Util.isOnBackgroundThread()) {
            return get(activity.getApplicationContext());
        } else {
            assertNotDestroyed(activity);
            android.app.FragmentManager fm = activity.getFragmentManager();
            return fragmentGet(activity, fm, null /*parentHint*/);
        }
    }
    public RequestManager get(Context context) {
        if (context == null) {
            throw new IllegalArgumentException("You cannot start a load on a null Context");
        } else if (Util.isOnMainThread() && !(context instanceof Application)) {
            if (context instanceof FragmentActivity) {
                return get((FragmentActivity) context);
            } else if (context instanceof Activity) {
                return get((Activity) context);
            } else if (context instanceof ContextWrapper) {
                return get(((ContextWrapper) context).getBaseContext());
            }
        }

        return getApplicationManager(context);
    }

如果是子线程

代码语言:javascript
复制
private RequestManager getApplicationManager(Context context) {
        ......
        applicationManager = factory.build(glide, new ApplicationLifecycle(), new EmptyRequestManagerTreeNode());//------主要这句
        ......

        return applicationManager;
    }

ApplicationLifecycle里面就调用了onStart方法,也就是子线程无法进行生命周期管理

代码语言:javascript
复制
class ApplicationLifecycle implements Lifecycle {
  @Override
  public void addListener(LifecycleListener listener) {
    listener.onStart();
  }

  @Override
  public void removeListener(LifecycleListener listener) {
    // Do nothing.
  }
}

然后再看,是主线程的情况

代码语言:javascript
复制
private RequestManager fragmentGet(Context context, android.app.FragmentManager fm,
                                       android.app.Fragment parentHint) {
        RequestManagerFragment current = getRequestManagerFragment(fm, parentHint);
        RequestManager requestManager = current.getRequestManager();
        if (requestManager == null) {
            Glide glide = Glide.get(context);
            requestManager =
                    factory.build(glide, current.getLifecycle(), current.getRequestManagerTreeNode());
            current.setRequestManager(requestManager);
        }
        return requestManager;
    }

getRequestManagerFragment会自动生成空白fragment,里面有ActivityFragmentLifecycle 这是ActivityFragmentLifecycle种的部分实现

代码语言:javascript
复制
  @Override
  public void addListener(LifecycleListener listener) {
    lifecycleListeners.add(listener);

    if (isDestroyed) {
      listener.onDestroy();
    } else if (isStarted) {
      listener.onStart();
    } else {
      listener.onStop();
    }
  }

那又是如何调用的呢? 就在fragmentGet函数里面的factory.build里面。这是个借口,具体实现就是new RequestManager。里面有这样一段代码

代码语言:javascript
复制
if (Util.isOnBackgroundThread()) {
            mainHandler.post(addSelfToLifecycle);
        } else {
            lifecycle.addListener(this);//这样就算是这是开启生命周期管理
        }

总结:其实with就是用来进行生命周期管理的(不能写在子线程中,不然不会管理)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年08月23日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档