美文网首页
Glide 图片加载库源码分析2-with 方法获取图片加载请求

Glide 图片加载库源码分析2-with 方法获取图片加载请求

作者: jkwen | 来源:发表于2021-07-10 08:55 被阅读0次
    public static RequestManager with(@NonNull FragmentActivity activity) {
        return getRetriever(activity).get(activity);
    }
    

    前面说到,getRetriever() 方法返回了 RequestManagerRetriever 对象,这次来看看 get 方法怎么获取 RequestManager。

    get() 实现了重载,根据入参类型不同分为 FragmentActivity, Activity, Fragment 等,

    public RequestManager get(@NonNull FragmentActivity activity) {
        if (Util.isOnBackgroundThread()) {
            return get(activity.getApplicationContext());
        } else {
            assertNotDestroyed(activity);
            frameWaiter.registerSelf(activity);
            FragmentManager fm = activity.getSupportFragmentManager();
            return supportFragmentGet(activity, fm, null, isActivityVisible(activity));
        }
    }
    

    假设我们是在 Activity 上发起的图片加载,那么会触发这个方法的调用。首先会对当前线程做区分,非主线程会采用 ApplicationContext 作为入参,如果是主线程就会利用 FragmentManager,

    private RequestManager supportFragmentGet(Context context, FragmentManager fm, Fragment parentHint, boolean isParentVisible) {
        SupportRequestManagerFragment current = getSupportRequestManagerFragment(fm, parentHint);
        RequestManager requestManager = current.getRequestManager();
        if (requestManager == null) {
            Glide glide = Glide.get(context);
            requestManager = factory.build(glide, current.getGlideLifecycle(), current.getRequestManagerTreeNode(), context);
            current.setRequestManager(requestManager);
        }
        return requestManager;
    }
    

    为啥会用到 FragmentManager,原来 Glide 定义了一个 SupportRequestManagerFragment 用来存储 RequestManager,这个 Fragment 我觉得可以不用理解为我们平时用的 Fragment,而更像是仅用作一个生命周期管理的载体,跟页面展示无关。

    所以页面不同使得 FragmentManager 不同,FragmentManager 不同使得 Fragment 不同,进而使得 RequestManager 不同。这么说来 RequestManager 就跟 Activity 相关了,如果多个 Fragment 用同一个 FragmentManager,那么就持有同一个 RequestManager 对象

    一开始,这个 Fragment 里肯定没有 RequestManager 对象,要去创建,创建它的工厂对象在创建 RequestManagerRetriever 对象时赋值,但实际的来源是在 GlideBuilder 的配置上,

    private static void initializeGlide(/**省略**/) {
        RequestManagerRetriever.RequestManagerFactory factory = annotationGeneratedModule != null ? annotationGeneratedModule.getRequestManagerFactory() : null;
        builder.setRequestManagerFactory(factory);
    }
    

    但这其实也有条件,如果我们开发者没有去利用注解配置,那就是 null, 可见还有地方没分析到,

    public RequestManagerRetriever(RequestManagerFactory factory, GlideExperiments experiments) {
        this.factory = factory != null ? factory : DEFAULT_FACTORY;
        //省略部分代码......
    }
    private static final RequestManagerFactory DEFAULT_FACTORY = new RequestManagerFactory() {
        @Override
        public RequestManager build(Glide glide, Lifecycle lifecycle, RequestManagerTreeNode requestManagerTreeNode, Context context) {
            return new RequestManager(glide, lifecycle, requestManagerTreeNode, context);
        }
    }
    

    顺着思路再看就会发现,RequestManagerRetriever 的构造方法做了保证,默认返回了一个 RequestManager 对象。

    最后会和 Fragment 做一个关联,并将这个 RequestManager 对象返回。如果下次还是同一个 Activity,那就不会再新创建了,而是之前返回。

    至此,with 方法算是看的差不多了,也了解了一些相关概念,随着后面方法的梳理,再慢慢将这个孤立的概念关联起来。

    相关文章

      网友评论

          本文标题:Glide 图片加载库源码分析2-with 方法获取图片加载请求

          本文链接:https://www.haomeiwen.com/subject/fpyzultx.html