Glide 是 Android 平台上一款非常流行的图片加载库,它的核心设计目标是实现高效、流畅的图片加载体验,同时兼顾性能优化和易用性。其实现原理可以从以下几个层面来分析:
Glide 采用了模块化、分层的架构,主要分为以下几个核心组件:
Glide 类:作为对外暴露的入口,提供
with()、
load()、
into() 等链式调用方法,构建图片请求。
RequestBuilder:请求构建器,负责配置请求参数(如图片尺寸、占位符、缓存策略等)。
Request:封装了一次完整的图片加载请求,包含目标 View、加载参数等信息。
ModelLoader:模型加载器,负责将图片的源(如 URL、本地路径、资源 ID 等)加载为输入流或字节流。
例如:
HttpUrlLoader(网络图片)、
FileLoader(本地文件)、
ResourceLoader(资源文件)等。
DataFetcher:数据获取器,由
ModelLoader 创建,负责实际的 I/O 操作(如网络请求、文件读取)。
Decoder:解码器,将原始数据(如字节流)解码为图片对象(
Bitmap 或
Drawable)。
例如:
BitmapDecoder、
GifDecoder(支持动态图)。
Transformer:转换器,对解码后的图片进行处理(如缩放、裁剪、旋转)。
Encoder:编码器,将处理后的图片缓存到本地(磁盘缓存)。
LruResourceCache:使用 LRU(最近最少使用)算法管理内存中的图片资源,避免频繁 GC。
MemoryCache 接口:可自定义内存缓存实现。
磁盘缓存:
DiskLruCache:基于 LRU 算法的磁盘缓存,存储图片的原始数据或处理后的结果。支持缓存策略配置(如仅缓存原始数据、缓存处理后的图片等)。
RequestManager:管理所有图片请求的生命周期,与
Activity/
Fragment 生命周期绑定,避免内存泄漏。
GlideExecutor:线程池管理,负责执行后台任务(如网络请求、解码、缓存读写)。
默认使用多个线程池,分别处理不同类型的任务(如网络、磁盘、解码)。
Target:图片加载完成后的回调接口,负责将图片设置到目标 View 或处理结果。
以加载网络图片为例,Glide 的完整工作流程如下:
Glide.with(context)
.load("https://example.com/image.jpg")
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.into(imageView);
with(context):创建
RequestManager,绑定生命周期。
load(url):创建
RequestBuilder,指定图片源。
into(imageView):构建
Request 并提交执行。
key(由 URL、尺寸、处理参数等生成)查找是否存在缓存的图片资源。
若存在且未过期,直接回调
Target 设置图片。
磁盘缓存:若内存缓存未命中,检查磁盘缓存。
若存在,读取缓存数据并解码,然后存入内存缓存,最后设置图片。
ModelLoader(如
HttpUrlLoader)创建
DataFetcher,发起网络请求。网络请求在后台线程执行,获取图片的输入流。
DataFetcher 将输入流交给
Decoder 解码为
Bitmap 或
Drawable。若有配置转换器(如缩放、裁剪),对图片进行处理。处理后的图片存入内存缓存和磁盘缓存(根据配置)。
Target.onResourceReady(),将图片设置到
ImageView。若加载失败,回调
Target.onLoadFailed(),显示错误占位符。当
Activity/
Fragment 销毁时,
RequestManager 取消所有未完成的请求,避免内存泄漏。
RequestManager 与
Activity/
Fragment 的生命周期绑定,在
onPause 时暂停加载,
onDestroy 时取消请求,释放资源。
BitmapPool 复用
Bitmap 对象,减少内存分配和 GC 次数。动态尺寸:根据
ImageView 的大小自动调整图片尺寸,避免加载过大的图片占用过多内存。内存缓存策略:LRU 算法优先保留最近使用的图片,限制最大内存占用。
JPG、
PNG,还支持
GIF、
WebP 等动态图片和高效格式。通过
Decoder 接口可扩展支持自定义图片类型。
DraweeView,功能更强大(如渐进式加载、圆角、边框)。Glide 的 API 更简洁,集成成本更低。Glide 的磁盘缓存默认存储处理后的图片,而 Fresco 存储原始数据。
Glide 的成功在于其高效的缓存策略、优秀的生命周期管理、灵活的扩展性以及对多种图片类型的良好支持。通过分层架构和模块化设计,Glide 能够在性能和易用性之间取得平衡,成为 Android 开发中图片加载的首选库之一。