前言 Glide是一个快速高效的Android图片加载库,注重于平滑的滚动。Glide提供了易用的API,高性能、可扩展的图片解码管道(decode pipeline),以及自动的资源池技术。...目前,在 Android 开发中 Glide 算得上是图片加载框架中的佼佼者了。其巧妙的设计和卓越的性能令人赞叹不已。...Glide : https://github.com/bumptech/glide version : v4.9.0 Glide使用方法 Glide 的 API 有很多,但是我们这里就挑最简单的讲: Glide.with...而在 fragment 中,有着 onStart() onStop() 的生命周期监听。因此,Glide 就实现了在 Fragment 和 Activity 的图片加载请求的生命周期管理。...结束语 综上所述,Glide.with 中,主要做的事情有两件: Glide 单例的初始化过程 Glide 请求的生命周期管理 如果传入的是 ApplicationContext ,得到的就是 applicationManager
if (isInitializing) { throw new IllegalStateException("You cannot call Glide.get() in registerComponents...RequestManagerFragment是一个很重要的类,Glide就是通过它作为生命周期的分发入口,RequestManagerFragment的默认构造函数会实例化一个ActivityFragmentLifecycle...RequestManagerRetriever构造时传入的RequestManagerFactory工厂类实例化一个RequestManager, 把RequestManagerFragment中的ActivityFragmentLifecycle...监听手机网络状态变化的广播,然后在connectivityReceiver中调用isConnect进行网络状态确认,根据网络状态是否变化,如果有变化就回调监听ConnectivityMonitor.ConnectivityListener...如何监测内存 在Glide构造的时候会调用registerComponentCallbacks进行全局注册, 系统在内存紧张的时候回调onTrimMemory,然后根据系统内存紧张级别进行memoryCache
Glide提供了非常便捷的链式调用接口,以及丰富的拓展和自定义功能,开发者可以非常简单地对框架进行配置和图片再加工。...如有不对的地方,欢迎指正~ 那么接下来,我们就先看看Glide是如何进行框架初始化的。 注意:本文源码版本为v4.6.1,不同版本可能存在一些差异! 二、Glide.with发生了什么? 1....我们重点来看Glide.get(context) 这里是一个典型的双检锁单例模式。...接着以上代码,Glide将逐个调用剩下的GlideModule,并回调applyOptions和registerComponents接口,这时,用户配置的GlideModule就会被调用,同时用户设置的参数也就被配置到...在以上代码中,发现一句代码,在回调registerComponents前,首先构建了glide的实例。 这是一句非常重要的代码,整个Glide框架最重要的初始化内容都在其中实现。
Glide.get()方法获取Glied对象 // 2.调用getRequestManagerRetriever()获取到 RequestManagerRetriever return Glide.get...对象 调用 Glide.get() 方法获取 Glied 对象 调用 getRequestManagerRetriever() 得到RequestManagerRetriever 对象 2.通过 RequestManagerRetriever...() in registerComponents()," + " use the provided Glide instance instead"); } //防止多次调用..., 获取不同的场景执行器, 然后调用了它们的 startNext 方法加载请求任务的数据, 其映射表为 场景 场景描述 场景执行器 Stage.RESOURCE_CACHE 从磁盘中缓存的资源中获取数据...} return started; } } 可以看出SourceGenerator主要有两步 调用 DecodeHelper.getLoadData 获取当前请求的数据加载器 调用加载器中的
算法 该算法基于 Lru 算法中的DiskLruCache算法,具体应用在磁盘缓存的需求场景中 该算法被封装到Glide自定义的工具类中(该工具类基于Android 提供的DiskLruCache...Glide.get() 创建Glide对象-->分析2 } Glide.get() --> // 作用:采用单例模式创建Glide对象 public static Glide...调用getDiskCache()获取Glide自己编写的DiskLruCache工具类实例 // 2....调用getDiskCache()获取DiskLruCache实例 // 2....调用getDiskCache()获取DiskLruCache实例 // 2.
然而事实上,Glide类确实是有创建实例的,只不过是在内部由Glide自动帮我们创建和管理了,对于开发者而言,大多数情况下是不用关心它的,只需要调用它的静态方法就可以了。...现在继续回到Glide的get()方法中,得到了Glide对象的实例之后,接下来又通过一个循环调用了每一个GlideModule的registerComponents()方法,在这里我们可以加入替换Glide...其实道理很简单,因为load(String)方法只是Glide给我们提供一种简易的API封装而已,它的底层仍然还是调用的GlideUrl组件,因此我们在替换组件的时候只需要直接替换最底层的,这样就一步到位了...如果对OkHttp不需要进行任何自定义的配置,那么就调用无参的Factory构造函数即可,这样会在内部自动创建一个OkHttpClient实例。...下篇文章中,我们将会利用本篇文章中学到的知识,对Glide进行一个高级的功能扩展,感兴趣的朋友请继续阅读 Android图片加载框架最全解析(七),实现带进度的Glide图片加载功能 。
概览 基于Glide最新版本4.11.0,未迁AndroidX的项目只能使用4.9.0,简单使用: 引入依赖,app/build.gradle: implementation 'com.github.bumptech.glide...glide = Glide.get(context.getApplicationContext()); applicationManager = factory.build...glide = Glide.get(context); //如果空fragment没有RequestManager,就创建一个 requestManager...发散:添加空fragment来感知页面生命周期的思想,在Lifecycle的实现中也可以看到,见ReportFragment的injectIfNeededIn方法。...Fresco具有一定侵入性,需要继承SimpleDraweeView; Fresco调用繁琐,没有Glide的链式调用优雅,当然这个可以包一层来解决; Fresco在5.0以下的系统进行了内存优化(Ashmem
,即不缓存转换后的图片) // DiskCacheStrategy.RESULT:只缓存转换后的图片(即最终的图像:降低分辨率后 / 或者转换后 ,不缓存原始图片 设置跳过内存缓存 Glide .with...清理缓存 Glide.get(this).clearDiskCache();//清理磁盘缓存 需要在子线程中执行 Glide.get(this).clearMemory();//清理内存缓存 可以在UI...类型影响到Glide加载图片的优化程度 Glide可以监视Activity的生命周期,在Activity销毁的时候自动取消等待中的请求。...Demo实例 没有Demo的代码讲解不是好文章,让我们来一步步学会使用Glide。...(Url) .into(targetImageView); 还有具体其他功能需要配置的自己按照我上面写的进行配置就好了~ 这里再贴上Glide的Github地址:请点击这里
前言 在上一篇文章中我们体验了Glide-4.0的强大,以及更加简便的API,很多童鞋已经开始迁移了,那么接下来我们一起探索一下他的神奇之处: 首先我们来看一下4.0的基本用法: GlideApp.with...准备 想要阅读源码那么久需要先下载源码, GitHub地址: https://github.com/bumptech/glide 我们这一篇是基于4.1.0讲解的,后续如果想查看这个版本的代码可以通过下面的链接...GlideApp这个类事通过上面的注解获得到的,是不容许被修改的,是Glide在应用中的入口,做一些初始化,获取图片存储路径之类的,非常简单,注释也非常清楚,就不详细叙述了。...()方法中传入的是一个Application对象,那么这里就会调用上面的get()方法重载,最后来获取一个RequestManager对象。...通过上图我们会发现不论传入Activity、FragmentActivity、Fragment最终都会调用图中红框中的方法,而这两个方法最终流程都是一致的就是那就是会向当前的Activity当中添加一个隐藏的
= "http://218.192.170.132/1.jpg"; //Glide使用了流式接口的调用方式 //Glide类是核心实现类。...(即所有版本,默认行为) //NONE:不作任何磁盘缓存。...清理缓存 Glide.get(this).clearDiskCache();//清理磁盘缓存 需要在子线程中执行 Glide.get(this).clearMemory();//清理内存缓存 可以在UI...Demo实例 没有Demo的代码讲解不是好文章,让我们来一步步学会使用Glide。...---- 请帮顶或评论点赞!因为你的鼓励是我写作的最大动力!
如果没有发现稳定性或API中的重大问题,预计不久之后就会发布非RC版本。 3.发布时间表 Glide在过去采取了一种相当随意的方式发布,主要是因为在空闲的时候采取做。...未来,Glide有望尝试提供定期发布: 每个月15日左右发行(确切的日期可能有所不同) 只有在前版本中没有更改的情况下才会跳过此版本。 只有在主要版本升级的时候才会去更改API。...-4.0.0-RC0.jar 582 KB Source code (zip) Source code (tar.gz) 更多下载请移步官网:Glide 4.0.0 RC0 官方说明 从V3迁移到...在Glide v3中,选项是由一系列复杂的多类型构建器单独处理的。在Glide v4中,这些已被具有单一类型的单个构建器和可以提供给构建器的一系列选项的对象所替代。...RequestBuilder提供了影响加载过程本身的选项,比如要加载的类型(url, uri etc),任何 thumbnail()和listener()请求,RequestBuilder也提供在哪里开始加载的方法
都干什么用的? Glide调用某一个方法后具体干了什么事? 本文基于Glide的最新版本 4.10.0 进行分析,如有错误欢迎指出。...Glide提供了易用的API,高性能、可扩展的图片解码管道(decode pipeline),以及自动的资源池技术。 2. 那你为什么要用Glide?...if (isInitializing) { throw new IllegalStateException( "You cannot call Glide.get() in registerComponents...调用者似乎特别有可能在保留的片段中这样做(#2262)。 // // #1 总是一个错误。充其量,调用者只是在像异步任务。...早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。
//通过实例化一个新对象或利用Activity和Fragment生命周期内置的处理功能进行检索,请对Fragment或Activity使用静态Glide.load方法。...: 回调的线程池,在主线程中执行回调; 生成的Request 实例为 SingleRequest,它是专门为了Target而加载资源的。...ThumbnailRequestCoordinator :一个协调器,用于协调两个单独的Request,它们同时加载图像的小缩略图版本和图像的完整尺寸版本。...) { //添加到请求容器中 requests.add(request); //如果当前的RequestManager不处于暂停状态,那么直接开始请求 if (!...> fetcher, DataSource dataSource, Key attemptedKey) { // 此数据提取程序将从文件中加载并提供错误的数据源,因此请覆盖使用原始提取程序的数据源
不过,上一篇文章只能说是比较粗略地阅读了Glide整个执行流程方面的源码,搞明白了Glide的基本工作原理,但并没有去深入分析每一处的细节(事实上也不可能在一篇文章中深入分析每一处源码的细节)。...return glide; } ... } 这里我们还是只看关键,在第11行去构建ModelLoader对象的时候,先调用了一个Glide.get()方法,而这个方法就是关键。...,调用getDiskCache()方法获取到的就是Glide自己编写的DiskLruCache工具类的实例,然后调用它的get()方法并把缓存Key传入,就能得到硬盘缓存的文件了。...而在这个方法中同样调用了getDiskCache()方法来获取DiskLruCache实例,接着调用它的put()方法就可以写入硬盘缓存了,注意原始图片的缓存Key是用的resultKey.getOriginalKey...先是在第3行调用transform()方法来对图片进行转换,然后在writeTransformedToCache()方法中将转换过后的图片写入到硬盘缓存中,调用的同样是DiskLruCache实例的put
那个时候因为我一直研究的都是Glide 3.7.0版本,再加上RC版本还不太稳定,因此整个系列也都是基于3.7.0版本来写的。...而现在,Glide的最新版本已经出到了4.4.0,可以说Glide 4已经是相当成熟和稳定了。...当然可以,Glide提供了各种各样非常丰富的API支持,其中就包括了占位图功能。 顾名思义,占位图就是指在图片的加载过程中,我们先显示一张临时的图片,等图片加载出来了再替换成要加载的图片。...而DiskCacheStrategy.AUTOMATIC是Glide 4中新增的一种缓存策略,并且在不指定diskCacheStrategy的情况下默认使用就是的这种缓存策略。...自定义模块 自定义模块属于Glide中的高级功能,同时也是难度比较高的一部分内容。 这里我不可能在这一篇文章中将自定义模块的内容全讲一遍,限于篇幅的限制我只能讲一讲Glide 4中变化的这部分内容。
我想大多数人在自己的项目中还是使用Glide3.7.1这个版本吧!不过Glide版本现在已经到4.4.0了!...添加网络权限 在这个地方可能你的项目会报个错:java.lang.NoSuchMethodError 这是因为Glide4中已经引入了appcompat-v7包,版本不一致引起。...解决方法: Glide4.4.0引入的是27.0.2版本,所以把你项目中的appcompat-v7更换为: implementation'com.android.support:appcompat-v7...// 系数sizeMultiplier必须在(0,1)之间, // 可以递归调用该方法。...一样,其他关于Glide4的功能在这里没有详细给出,需要了解,请看:
} ··· 这里面,我们看第11行去构建ModelLoader对象的时候,先调用了一个Glide.get()方法,而这个方法就是关键。...,调用getDiskCache()方法获取到的就是Glide自己编写的DiskLruCache工具类的实例,然后调用它的get()方法并把缓存Key传入,就能得到硬盘缓存的文件了。...而在这个方法中同样调用了getDiskCache()方法来获取DiskLruCache实例,接着调用它的put()方法就可以写入硬盘缓存了,注意原始图片的缓存Key是用的resultKey.getOriginalKey...先是在第3行调用transform()方法来对图片进行转换,然后在writeTransformedToCache()方法中将转换过后的图片写入到硬盘缓存中,调用的同样是DiskLruCache实例的put...那么,这里是通过调用fetcher.getId()方法来获取的图片url地址,而我们在上一篇文章中已经知道了,fetcher就是HttpUrlFetcher的实例,我们就来看一下它的getId()方法的源码吧
当然,在本篇文章的最后我会提供这个Demo的完整源码,但是这里我仍然希望大家能用心跟着我一步步来编写。 那么我们现在就开始吧,首先创建一个新项目,就叫做GlideProgressTest吧。...然后在构造方法中,我们调用了ProgressInterceptor中的LISTENER_MAP来去获取该url对应的监听器回调对象,有了这个对象,待会就可以回调计算出来的下载进度了。...那么为了兑现自己当初八篇的承诺,我准备最后一篇写一下关于Glide 4.0版本的用法,顺便让我自己也找个契机去研究一下新版本。...当然,这并不是说Glide 3.7版本就已经淘汰了,事实上,Glide 3.7版本十分稳定,而且还能几乎完全满足我平时开发的所有需求,是可以长期使用下去的一个版本。...感兴趣的朋友请继续阅读 Android图片加载框架最全解析(八),带你全面了解Glide 4的用法 。
用Glide完成一个完整的图片加载功能请求,需要向其构造器中至少传入3个参数,分别是: with(Context context)- Context是许多Android API需要调用的, Glide...也不例外。...(必须在UI线程中调用) github项目地址 图片的各种设置信息–SingleConfig 我们所设置图片的所有属性都写在这个类里面。...初始化的实现 我们在application中调用 ImageLoader.init(getApplicationContext()); 会最终调用到下面这个方法,最终的操作都是在这里进行的 public...-dontwarn okio.** 由于具体使用文章较长,具体如何使用详细API介绍请移步本人下一篇博客 Glide二次封装库的使用 http://blog.csdn.net/github_33304260