Glide源码解析

Glide 官方地址

因为很好奇Glide的加载原理,看了别人的分析之后印象还是不够深,这里自己分析一下,记录一些源码流程,方便记忆。

Glide.with(context).load(url).into(adImageView);

让我看看Glide这句话做了些什么吧!

Glide.with(context)

    public static RequestManager with(Context context) {
        RequestManagerRetriever retriever = RequestManagerRetriever.get();
        return retriever.get(context);
    }

先获取了一个RequestManagerRetriever对象

    public RequestManager get(Context context) {
        if (context == null) {
           throw new IllegalArgumentException("You cannot start a load on a null Context");
         //判断当前线程是否是主线程,并且不是application
        } else if (Util.isOnMainThread() && !(context instanceof Application)) {
            //判断context是什么类型的
            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);
    }

然后调用了RequestManagerRetrieverget(Context context)方法,这里主要是判断当前的context属于什么,根据context去创建对应的RequestManager这里我们插一下,如果我们传的是Application的context怎么办的。

    private RequestManager getApplicationManager(Context context) {
        if (applicationManager == null) {
            synchronized (this) {
                if (applicationManager == null) {
                    //我们这里为其创建了一个单例的applicationManager
                  applicationManager = new RequestManager(context.getApplicationContext(),
                        new ApplicationLifecycle(), new EmptyRequestManagerTreeNode());
                }
            }
        }
        return applicationManager;
    }

其实很简单,就是创建了一个单例的applicationManager。那我们继续分析。

    public RequestManager get(FragmentActivity activity) {
        //判断是否是后台线程
        if (Util.isOnBackgroundThread()) {
            //如果在子线程,直接用application的context
            return get(activity.getApplicationContext());
        } else {
            //判断此activity是否已经销毁了
            assertNotDestroyed(activity);
            //获取能管理和当前Activity有关联的Fragment的FragmentManager。
            FragmentManager fm = activity.getSupportFragmentManager();
            return supportFragmentGet(activity, fm);
        }
    }

当我们传入的是一个FragmentActivity时,我们要拿到和当前有关联的FragmentManager,我们通过这个FragmentManager去创建RequestManager

    RequestManager supportFragmentGet(Context context, FragmentManager fm) {
        //从缓存中获取fragment,如果没有就创建
        SupportRequestManagerFragment current = getSupportRequestManagerFragment(fm);
        //获取当前的requestManager,第一次为空
        RequestManager requestManager = current.getRequestManager();
        if (requestManager == null) {
            //为空时给其创建一个requestManager
            requestManager = new RequestManager(context, current.getLifecycle()
                    , current.getRequestManagerTreeNode());
            current.setRequestManager(requestManager);
        }
        return requestManager;
    }

这里先去缓存获取,因为我们可能在activity中多个地方去加载图片了,这里优化了内存。第一次一般都为空,会创建requestManager对象,其中current.getLifecycle()需要
注意一下,然后把当前requestManager返回了。
我们先看一下getSupportRequestManagerFragment()这个方法

    SupportRequestManagerFragment getSupportRequestManagerFragment(final FragmentManager fm) {
        //获取当前fm,第一次为空
        SupportRequestManagerFragment current = (SupportRequestManagerFragment) fm.findFragmentByTag(FRAGMENT_TAG);
        if (current == null) {
            //从缓存中获取,第一次应该为空
            current = pendingSupportRequestManagerFragments.get(fm);
            if (current == null) {
                //当为空时,创建一个自己的SupportRequestManagerFragment
                current = new SupportRequestManagerFragment();
                //加入到缓存中
                pendingSupportRequestManagerFragments.put(fm, current);
                //显示fragment
                fm.beginTransaction().add(current, FRAGMENT_TAG).commitAllowingStateLoss();
                handler.obtainMessage(ID_REMOVE_SUPPORT_FRAGMENT_MANAGER, fm).sendToTarget();
            }
        }
        return current;
    }

这个方法就开始去缓存获取了,如果有就返回,否则就会创建一个SupportRequestManagerFragment然后加入到界面中,其实就是Fragment。
到这里为止,glide的with就分析完了,流程图如下:

with.png

load(url)

    public DrawableTypeRequest<String> load(String string) {
        return (DrawableTypeRequest<String>) fromString().load(string);
    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 常见用法 一般都把图片加载的方法封装起来,一来是为了使用方便,二来就算以后的实际加载方法变了(比如把Glide换成...
    断了谁的弦阅读 1,877评论 0 0
  • 序言 在Android开发过程中,图片处理是必不可少的,图片处理可繁可简。目前有也出现了很多优秀的图片加载库,如G...
    左大人阅读 636评论 1 4
  • 一、LruCache 要分析Glide的源码,首先就需要分析LruCache。LruCache是基于LinkedH...
    zzq_nene阅读 532评论 0 1
  • 在Android开发过程中,加载图片是日常开发中最普通的操作了,市面上也有很多的优秀图片处理框架,如开源组织Squ...
    来个Android小哥阅读 840评论 0 5
  • Glide滑行的意思,可以看出这个库的主旨就在于让图片加载变的流畅。 这里我们从使用入手研究Glide源码: 拆成...
    奔跑吧哈哈阅读 1,599评论 0 11

友情链接更多精彩内容