2.8 KiB
2.8 KiB
Glide原理
目录
Glide架构
架构图
Request → Engine → DecodeJob → DataFetcher → ModelLoader
↓ ↓ ↓ ↓
Memory Disk Network Resource
Cache Cache Cache
核心组件
// 1. RequestManager:请求管理
// 2. Engine:引擎,协调加载
// 3. DecodeJob:解码任务
// 4. ModelLoader:模型加载器
// 5. ResourceCache:资源缓存
图片加载流程
加载流程
1. Glide.with().load().into()
2. RequestManager 创建 Request
3. Engine 检查缓存
4. 缓存未命中,创建 DecodeJob
5. 从网络/磁盘加载
6. 解码图片
7. 转换和缓存
8. 显示到 ImageView
代码示例
Glide.with(context)
.load(url)
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.override(200, 200)
.into(imageView);
缓存机制
三级缓存
// 1. 活动资源缓存(Active Resources)
// 2. 内存缓存(Memory Cache)
// 3. 磁盘缓存(Disk Cache)
缓存策略
// 默认策略:ALL
// - 原始图片缓存到磁盘
// - 转换后图片缓存到内存和磁盘
Glide.with(context)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(imageView);
内存管理
内存优化
// 1. 自动管理 Bitmap 内存
// 2. 根据 ImageView 大小加载
// 3. 及时释放资源
内存缓存
// LRU 缓存
// 最近最少使用的图片会被回收
Glide源码分析
关键类
// Glide:入口类
// RequestManager:请求管理
// Engine:引擎
// DecodeJob:解码任务
// BitmapPool:Bitmap 对象池
Glide最佳实践
1. 使用合适的缓存策略
// 根据场景选择缓存策略
.diskCacheStrategy(DiskCacheStrategy.ALL) // 缓存所有
.diskCacheStrategy(DiskCacheStrategy.NONE) // 不缓存
2. 设置图片大小
// 根据 ImageView 大小加载
.override(200, 200)
3. 处理加载失败
.error(R.drawable.error)
.fallback(R.drawable.fallback)
面试常见问题
Q1: Glide 的缓存机制?
答案:
- 三级缓存:活动资源、内存、磁盘
- LRU 算法管理缓存
- 自动管理内存
Q2: Glide 和 Picasso 的区别?
答案:
- Glide:功能更丰富,内存管理更好
- Picasso:更轻量,API 更简单
Q3: Glide 如何避免内存泄漏?
答案:
- 使用生命周期感知
- 自动取消请求
- 及时释放资源
最后更新:2024年