1. 总体架构
首先我们看下Glide总体架构图:
glide总体架构图
从架构图上,我们可以看出,glide并没有着眼于bitmap,而是进行了高度的抽象,所以我们不应该将glide看成一个图片加载框架,而是一个资源从不同形态之间转换的框架,从url到bitmap只是其中一种,所以我们不难理解glide甚至能从视频加载第一帧,因为它没有对输入类型做任何限制,都是统一抽象成的Request。
- 从Request到Data的设计——资源加载模块设计
首先我们看下总体过程:
glide从Request到Data
这里以从url到inputstream二进制流为例,之所以这里有三条分路,这和glide的缓存策略有关。首先有一点要澄清,这里从Request到Data其实是跳过了内存缓存的介绍,毕竟如果内存中已有bitmap缓存,我们直接取用就可以了,无需这么麻烦(详细的缓存方案后续文章会介绍)。因此,这里有三条路径主要是磁盘缓存和网络缓存,而磁盘缓存有两种:
-
DataCache 从原始Request加载到的二进制流直接缓存,比如从url加载的原图缓存
-
ResourceCache 将从Request获取的Data数据处理后缓存,比如将一个url的原图进行压缩后又缓存起来,glide能够缓存不同尺寸的图片的原因就在于这一步。
而SourceGenerator就是跳过缓存直接从原始Request获取请求了。
2.1 Request是如何被加载的
由于glide的这种高度抽象,现在我们面临着一个问题:如此多类型的Request和如此多的Data,具体怎么去加载它呢?比如说Request有url、uri、File、资源id、视频等等,不同的Request肯定有不同的加载方式,同一个Request既可能从网络加载,也可能从磁盘加载,可能性太多,那么我们怎么去加载呢?if-else去判断吗?一个优秀的框架肯定不会干这种low到爆的事。这里我们介绍一些新的角色:
ModelLoader类图
这里,针对每一种Request,我们都有对应的ModelLoader,当一个Request进来时,我们可以遍历所有的ModelLoader,通过handles()方法判断这个ModelLoader能否处理这种Request,这样我们就能解决第一个问题,即不同的Request如何管理加载,有了ModelLoader机制,如果我们想增加一种Request,我们只要开发对应的ModelLoader即可。
有了ModelLoader,其实是不够的,它只是用来判断这个Request是否能否处理,为了能真正的加载请求,Glide引入了DataFetcher,不同的方式对应一个不同的DataFetcher,两者职责分离,这是因为同一种Request其实有很多加载方式,比如从网络加载,从磁盘加载等等,非常复杂,所以这里独立出一个DataFetcher。其中LoadData只是对DataFetcher的一种包装,多包含了一些信息而已。
2.2 小结
现在,我们根据传入的请求具体类型(比如url还是file还是字节数组),通过遍历所有的ModelLoader判断该ModelLoader能否处理这种请求,然后用该ModelLoader中的DataFetcher去具体加载这个请求。
3. 从Data到Resource的设计——解码和转码模块设计
有了ModelLoader和DataFetcher机制,Glide已经能方便的将一个原始请求从不同的地方加载到内存中了,这个时候这份数据还只是单纯的二进制数据(携带了格式数据)而已,我们称其为Data,现在需要进行解码过程,剔除原始的格式信息,然后拿原始信息重新编码,将其转化成不同的格式,比如将一个jpg先解码然后转码成Bitmap,或者转码成Gif,解码以及转码后的数据我们称其为Resource。现在面临的问题还是一样的:
由于框架的设计决定了需要解码的格式是不定的,要转码的格式也是不定的,如何高效的组织这个过程呢?
这个和Request被加载的过程类似,这里采用的是模板方法设计模式:
解码转码类图.
可以看到,这里我们能从Registry中获取所有的ResourceDecoder和ResourceTranscoder,然后判断哪个解码器或转码器适合当前格式,直接调用相关的decode和transcode方法就可以了。
以这种方式,我们能随意扩展不同格式的解码和转码了。
最后
都说三年是程序员的一个坎,能否晋升或者提高自己的核心竞争力,这几年就十分关键。
技术发展的这么快,从哪些方面开始学习,才能达到高级工程师水平,最后进阶到Android架构师/技术专家?我总结了这 5大块;
我搜集整理过这几年阿里,以及腾讯,字节跳动,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 PDF(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。
Java语言与原理;
大厂,小厂。Android面试先看你熟不熟悉Java语言
高级UI与自定义view;
自定义view,Android开发的基本功。
性能调优;
数据结构算法,设计模式。都是这里面的关键基础和重点需要熟练的。
NDK开发;
未来的方向,高薪必会。
前沿技术;
组件化,热升级,热修复,框架设计
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
我在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多
当然,想要深入学习并掌握这些能力,并不简单。关于如何学习,做程序员这一行什么工作强度大家都懂,但是不管工作多忙,每周也要雷打不动的抽出 2 小时用来学习。
不出半年,你就能看出变化!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
工作强度大家都懂,但是不管工作多忙,每周也要雷打不动的抽出 2 小时用来学习。
不出半年,你就能看出变化!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!