Android中Glide.with().load().into() 应付面试源码解析
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 频率
生命周期自动化管理避免内存泄漏
模块化设计支持灵活扩展