1. with(this)
:生命周期绑定
Glide.with(Activity/Fragment/Context)
核心机制:创建与 UI 生命周期绑定的
RequestManager
底层实现:
通过
RequestManagerRetriever
获取单例非 Application 上下文:
向 Activity/Fragment 添加隐藏 Fragment(
RequestManagerFragment
)通过 Fragment 生命周期回调控制请求(页面销毁时自动取消加载)
Application 上下文:使用全局生命周期
设计意图:解决内存泄漏问题,实现请求与页面生命周期同步
2. load(url)
:构建数据模型
.load(String url)
核心流程:
创建
DrawableTypeRequest
对象初始化
ModelLoader
:String.class
→StreamStringLoader
(处理网络流)最终组合为
ImageVideoModelLoader
(支持流 + 文件描述符双通道)
封装参数:
URL 数据源
解码器(
ImageVideoGifDrawableLoadProvider
)转码器(
GifBitmapWrapperDrawableTranscoder
)
关键设计:通过泛型抽象支持多种数据源(URL/文件/资源ID等)
3. into(imageView)
:加载与渲染
.into(ImageView)
▶ 阶段1:初始化
将
ImageView
封装为Target
(GlideDrawableImageViewTarget
)构建
GenericRequest
对象(整合 URL/Target/缓存策略等参数)
▶ 阶段2:缓存检查
▶ 阶段3:网络加载(未命中缓存时)
网络层:
使用
HttpUrlFetcher
(基于HttpURLConnection
)支持自动重定向(最大 5 次跳转)
// 核心下载逻辑 HttpURLConnection connection = url.openConnection(); InputStream is = connection.getInputStream();
解码流程:
通过
ImageVideoGifDrawableLoadProvider
选择解码器静态图:
StreamBitmapDecoder
→Downsampler.decode()
(处理尺寸采样/旋转)最终得到
BitmapResource
GIF:
GifResourceDecoder
→ 生成GifDrawable
统一封装为
GifBitmapWrapper
转码适配:
GifBitmapWrapperDrawableTranscoder
统一转码为GlideDrawable
静态图 →
GlideBitmapDrawable
GIF →
GifDrawable
▶ 阶段4:线程切换与渲染
切主线程:
通过
Handler(Looper.getMainLooper())
切换线程
// EngineJob 中的线程切换 MAIN_THREAD_HANDLER.obtainMessage(MSG_COMPLETE, this).sendToTarget();
渲染到 ImageView:
// GlideDrawableImageViewTarget 最终调用 imageView.setImageDrawable(glideDrawable);
GIF 处理:
调用
GifDrawable.start()
启动动画
关键核心设计
三级缓存体系:
活动资源(Active Resources)→ 内存缓存(LRC)→ 磁盘缓存(DiskLRU)
缓存Key生成规则:URL + 尺寸 + 变换签名
资源复用优化:
BitmapPool
复用 Bitmap 内存,减少 GC
Bitmap reusedBitmap = bitmapPool.get(width, height, config);
生命周期自动化:
通过隐藏 Fragment 实现请求自动取消
模块化扩展:
支持自定义
ModelLoader
(扩展数据源)支持自定义
Transformation
(图片变换)
智能尺寸计算:
自动读取 View 的 layout_width/layout_height
通过
ViewTarget.getSize()
计算适配尺寸
面试级回答模板
Glide.with().load().into()
的核心流程:1. 生命周期绑定(with)
通过隐藏 Fragment 绑定页面生命周期,确保页面销毁时自动释放资源
2. 数据建模(load)
创建
ModelLoader
处理不同类型数据源(URL 对应StreamStringLoader
)封装为可配置的
DrawableTypeRequest
3. 加载渲染(into)
缓存检查:三级缓存依次查询(活动缓存 → 内存 → 磁盘)
网络下载:未命中时通过
HttpUrlFetcher
下载数据流解码处理:根据图片类型选择解码器(静态图用
Downsampler
处理尺寸采样)统一转码:转换为
GlideDrawable
兼容静图/GIF线程切换:通过 Handler 切主线程渲染到 ImageView
GIF 处理:自动调用
start()
播放动画设计优势:
三级缓存减少网络请求
BitmapPool 复用内存降低 GC 频率
生命周期自动化管理避免内存泄漏
模块化设计支持灵活扩展