Glide 源码分析

一 、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()方法的参数来确定图片加载的生命周期,并没有什么特别复杂的逻辑。

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

相关阅读更多精彩内容

  • 前言 最近使用到 Glide 加载本地大图,写代码时想看看 Glide 有没有压缩图片避免出现 OOM 问题,随手...
    sunrain_阅读 4,502评论 0 1
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,473评论 25 709
  • 看了一些Glide源码分析的文章,发觉里面的部分代码实现已经发生变化,而对一些要点也没有深入分析,于是姑且自己总结...
    Reiya阅读 13,373评论 4 51
  • 前言 在App中,和用户交互的主要是Activity和Fragment,在交互的过程中,我们需要执行各种各样的任务...
    linheimx阅读 3,382评论 2 5
  • 梧桐zyd阅读 1,162评论 0 0

友情链接更多精彩内容