美文网首页
Glide 源码分析

Glide 源码分析

作者: 心中客 | 来源:发表于2017-11-22 12:05 被阅读11次

    一 、with()

    1、Glide 直接调用 with 方法,说明此with方法是静态的; Glide类源码中,对于with方法的重载种类,有五种;Context 、Activity 、FragmentActivity android.app.Fragment 、 android.app.Fragment。其实每一个with方法的重载的代码都非常简单,都是先 调用都是先调用RequestManagerRetriever的静态get()方法得到一个RequestManagerRetriever对象,这个静 态get()方法就是一个单例实现,没什么需要解释的。然后再调用RequestManagerRetriever的实例get()方法 ,去获取RequestManager对象。 现在主要讲activity的. 调用 with 方法 的时候,返回了一个RequestManager,而RequestManager 是通过 RequestManagerRetriver 来获得的。附上源码:

            public tatic RequestManager with(Activity activity) { 

                 RequestManagerRetriever retriever =RequestManagerRetriever.get();

                     return retriever.get(activity); 

             }

    2、对于RequestManagerRetriver这个类,在这个类当中,我们还是主要看 activity的get()方法。 附上源码: 

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)

    public RequestManager get(Activity activity) { if (Util.isOnBackgroundThread() || 

        Build.VERSION.SDK_INT= Build.VERSION_CODES.JELLY_BEAN_MR1 &&

        activity.isDestroyed()) {

        throw new IllegalArgumentException("You cannot start a load for a destroyed

        activity");

        }

    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)

        RequestManager fragmentGet(Context context, android.app.FragmentManager fm) {

            RequestManagerFragment current = getRequestManagerFragment(fm);

            RequestManager requestManager = current.getRequestManager();

            if (requestManager == null) {

            equestManager = new RequestManager(context, current.getLifecycle(),                              current.getRequestManagerTreeNode());

            current.setRequestManager(requestManager);

            }

         return requestManager;

    }

    根据此段源码,我们可以分析出 如果你当前是处于后台或者 android phone版本小于3.0,那么就直接走传入Applcation对象的get()方法;else这块我们可以看出,assertNotDestroyed()这个方法主要是对当前的activity进行一次是否存在的判断,而后则创建了一个自定义且没有界面的Fragment,那么这里为什么要添加一个隐藏的Fragment呢?因为Glide需要知道加载的生命周期。很简单的一个道理,如果你在某个Activity上正在加载着一张图片,结果图片还没加载出来,Activity就被用户关掉了,那么图片还应该继续加载吗?当然不应该。可是Glide并没有办法知道Activity的生命周期,于是Glide就使用了添加隐藏Fragment的这种小技巧,因为Fragment的生命周期和Activity是同步的,如果Activity被销毁了,Fragment是可以监听到的,这样Glide就可以捕获这个事件并停止图片加载了。

    调用getApplicationManager()方法来获取一个RequestManager对象。其实这是最简单的一种情况,因为Application对象的生命周期即应用程序的生命周期,因此Glide并不需要做什么特殊的处理,它自动就是和应用程序的生命周期是同步的,如果应用程序关闭的话,Glide的加载也会同时终止。(此处源码进行省略,有想了解的请自行下载源码)

    这里额外再提一句,如果我们是在非主线程当中使用的Glide,那么不管你是传入的Activity还是Fragment,都会被强制当成Application来处理。不过其实这就属于是在分析代码的细节了,本篇文章我们将会把目光主要放在Glide的主线工作流程上面,后面不会过多去分析这些细节方面的内容。

    总体来说,第一个with()方法的源码还是比较好理解的。其实就是为了得到一个RequestManager对象而已,然后Glide会根据我们传入with()方法的参数来确定图片加载的生命周期,并没有什么特别复杂的逻辑。

    相关文章

      网友评论

          本文标题:Glide 源码分析

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