Glide源码分析
文章平均质量分 79
Carlos_0419
这个作者很懒,什么都没留下…
展开
-
Glide源码分析(八),Glide的自定义模块扩展与实践
Generated APIGlide v4使用注解处理器(Annotation Processor)来生成出一个API,在Application模块中可使用该流式API一次性调用到RequestBuilder,RequestOptions和集成库中所有的选项。GeneratedAPI模式的设计出于以下两个目的:集成库可以为Generated API扩展自定义选项。在Applicat...原创 2018-06-11 14:07:34 · 1366 阅读 · 1 评论 -
Glide源码分析(二),基本加载类图介绍
经过前文Glide源码分析(一),基本加载代码流程的分析之后,想必大家还是有点云里雾里,这里我画出了Glide基本加载流程中涉及到的类以及它们之间的关系,帮助大家更好的理解这个过程。 Glide基本加载过程设计到的主类和关系图如下: 1.GlideGlide这个类是使用图片加载库的入口类,诸如很多第三方Sdk,都用到了外观模式,通过设计一个顶层的接口,供用户使用,减少用...原创 2018-06-12 15:50:56 · 1059 阅读 · 0 评论 -
Glide源码分析(三),Engine加载资源过程
通过前面的分析,我们知道真正去加载数据是在SingleRequest#onSizeReady方法中被触发,这个里面是调用了Engine#load方法,看到这个方法,我们大致可以猜到此时便开始去真正加载数据了,从缓存中读取或者是从网络获取等等。在开始之前,我们先简单了解一下Engine类中涉及到的一些类。 仍然以最简单的load方式为例子 Glide.with(this) ...原创 2018-06-12 15:48:45 · 1178 阅读 · 0 评论 -
Glide源码分析(四),DecodeJob执行过程
开始本文之前,DecodeJob它实现了Runnable接口,敏感的朋友可能已经意识到,加载代码的入口就在这里,会在一个新的线程中去加载资源。DecodeJob这个类的代码非常多,主要有以下几个重要的点。封装一些从上面传过来的参数信息,不知道是否还有印象,我们的glide大部分信息是通过前面RequestBuilder中得到的。这里,它内部构造了一个DecodeHelper类,封装了大部分的...原创 2018-06-12 15:45:59 · 896 阅读 · 0 评论 -
Glide源码分析(五),EngineJob与DecodeJob代码详细加载过程
在Glide源码分析(三),Engine加载资源过程文中,我们分析到Engine#load的最后一步,创建好了一对EngineJob和DecodeJob,随之调用EngineJob的start方法,启动加载任务。下面分析整个一个执行过程,文中相关情景下的方法特定调用的结果是还是基于一下这段code,虽然是由特殊入口,并不影响我们理解整个框架,反而是一个很好的突破口,理解代码的思想。示例代码如下:...原创 2018-06-12 15:43:00 · 1222 阅读 · 1 评论 -
Glide源码分析(六),缓存架构、存取命中分析
分析Glide缓存策略,我们还得从之前分析的Engine#load方法入手,这个方法中,展示了缓存读取的一些策略,我们继续贴上这块代码。Engine#loadpublic <R> LoadStatus load( GlideContext glideContext, Object model, Key signature, ...原创 2018-06-12 15:40:46 · 954 阅读 · 0 评论 -
Glide源码分析(七),总纲思路梳理
对于Glide源码分析,基本已经接近尾声,整体下来,整个Glide工程代码量还是比较大的,涉及的知识点以及设计模式也很多,很值得研究一下,这里我贴上github源码中,关于glide工程的一张简单的引用关系。如下: 这样大家面对这个强大的代码库也就不那么不知所措了,最核心的也就是library库,glide相关的绝大多数都是在这个里面的。上层不过是一些简单的扩展,比如volley与o...原创 2018-06-12 15:31:12 · 743 阅读 · 0 评论 -
DecodeJob结构
DecodeHelper 将DecodeJob中的部分属性,交由DecodeHelper进行管理和操作,使代码更加清晰。关于详细,参考DecodeHelper类相关方法分析DiskCacheProvider 内部返回了一个DiskCache的对象,具体的默认实现是DiskLruCacheWrapper。关于DiskCache详细结构,可以参考此文DiskCache结构。DeferredE...原创 2018-06-11 14:27:00 · 261 阅读 · 0 评论 -
DataFetcherGenerator结构
UML如下: DataFetcherGenerator 使用已注册的ModelLoaders{@link com.bumptech.glide.load.model.ModelLoader}和一个模型构造一系列的DataFetchers{@link com.bumptech.glide.load.data.DataFetcher}。FetcherReadyCallback 当...原创 2018-06-11 14:21:59 · 359 阅读 · 0 评论 -
DecodeHelper类相关方法分析
DecodeHelper类中,调用的方法,涉及到的东西比较多,最主要的是包括管理组件注册以扩展或替换Glide的默认加载,解码和编码逻辑的Registry类。在Glide类的构造方法中,如下: Glide( @NonNull Context context, @NonNull Engine engine, @NonNull MemoryCache mem...原创 2018-06-11 14:20:26 · 446 阅读 · 0 评论 -
DiskCache结构
UML如下: DiskCache 定义了从磁盘缓存中写入和读取的接口。DiskLruCache 基于文件系统的一个有限空间的缓存,每一个缓存项都有一个字符串的键和一个固定数量的值,每个键必须匹配正则表达式([a-z0-9_-]{1,120})。值可以是字节序列,随机流或者文件。内部也是基于LRU算法,底层由LinkedHashMap实现。Factory DiskCache...原创 2018-06-11 14:19:05 · 2622 阅读 · 0 评论 -
数据加载DataFetcher与ModelLoader结构
UML如下: glide数据加载模块,基本结构如上图所示,DataFetcher定义了取数据的接口,具体的通过何种方式取数据,网络还是本地,均是由其子类实现,接下来我们介绍DataFetcher的几个子类。ModelLoader是一个工厂接口,用于将任意复杂的数据模型转换为具体数据类型,从而能够使用DataFetcher去获取由该模型表示的资源的数据,具体的ModelLoader实现...原创 2018-06-11 14:18:03 · 1793 阅读 · 0 评论 -
Resource结构
UML图如下: Resource 一个包装了特定类型的资源接口,并且能够汇集和重用。DrawableResource 包装了Drawable相关的资源,其直接子类有BitmapDrawableResource、GifDrawableResource和NonOwnerDrawableResource。BitmapResource 包装了Bitmap的资源。NonOwned...原创 2018-06-11 14:16:51 · 460 阅读 · 0 评论 -
MemoryCache结构
UML如下: MemoryCache 定义了在内存中添加和移除资源的接口,还提供了获取当前缓存信息的接口,如缓存最大值以及当前的缓存大小(单位字节)。ResourceRemovedListener 在缓存中,每当有资源被移除,该接口会得到回调。MemoryCacheAdapter 一个简单的实现了MemoryCache的子类,实际工程并不会使用它,目前仅在测试用例中。L...原创 2018-06-11 14:15:40 · 1641 阅读 · 1 评论 -
Key结构
UML如下: Key 唯一标识一些数据的接口。实现必须实现{Object#equals(Object}和{Object#hashCode()}。 通常希望实现将所有在{@link java.lang.Object#equals(Object)}}和{@link Object#hashCode()}}中使用的唯一标识信息添加到给定的{@link java.security.Mess...原创 2018-06-11 14:14:37 · 633 阅读 · 0 评论 -
Glide源码分析索引
gilde源码分析,所有分析均是基于glide tag 4.7.1的代码。 系列文章如下:Glide源码分析(一),基本加载代码流程 Glide源码分析(二),基本加载类图介绍 Glide源码分析(三),Engine加载资源过程Glide源码分析(四),DecodeJob执行过程Glide源码分析(五),EngineJob与DecodeJob代码详细加载过程G...原创 2018-06-11 14:12:55 · 577 阅读 · 0 评论 -
Glide源码分析(一),基本加载代码流程
下面来看在Glide中最简单的图片加载代码 Glide.with(this) .load("https://p.upyun.com/docs/cloud/demo.jpg") .into(imageView);这应该是相对比较简单的加载图片的代码了,一步步来,看代码其实很讲究耐心,有时候会遇到很多层次的调用链,...原创 2018-06-12 15:53:32 · 1828 阅读 · 0 评论