Files
mkdocs/docs/android面试/开源框架/Glide原理.md
2026-01-15 11:53:37 +08:00

174 lines
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Glide原理
## 目录
- [Glide架构](#glide架构)
- [图片加载流程](#图片加载流程)
- [缓存机制](#缓存机制)
- [内存管理](#内存管理)
- [Glide源码分析](#glide源码分析)
- [Glide最佳实践](#glide最佳实践)
- [面试常见问题](#面试常见问题)
---
## Glide架构
### 架构图
```
Request → Engine → DecodeJob → DataFetcher → ModelLoader
↓ ↓ ↓ ↓
Memory Disk Network Resource
Cache Cache Cache
```
### 核心组件
```java
// 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
```
### 代码示例
```java
Glide.with(context)
.load(url)
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
.override(200, 200)
.into(imageView);
```
---
## 缓存机制
### 三级缓存
```java
// 1. 活动资源缓存Active Resources
// 2. 内存缓存Memory Cache
// 3. 磁盘缓存Disk Cache
```
### 缓存策略
```java
// 默认策略ALL
// - 原始图片缓存到磁盘
// - 转换后图片缓存到内存和磁盘
Glide.with(context)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(imageView);
```
---
## 内存管理
### 内存优化
```java
// 1. 自动管理 Bitmap 内存
// 2. 根据 ImageView 大小加载
// 3. 及时释放资源
```
### 内存缓存
```java
// LRU 缓存
// 最近最少使用的图片会被回收
```
---
## Glide源码分析
### 关键类
```java
// Glide入口类
// RequestManager请求管理
// Engine引擎
// DecodeJob解码任务
// BitmapPoolBitmap 对象池
```
---
## Glide最佳实践
### 1. 使用合适的缓存策略
```java
// 根据场景选择缓存策略
.diskCacheStrategy(DiskCacheStrategy.ALL) // 缓存所有
.diskCacheStrategy(DiskCacheStrategy.NONE) // 不缓存
```
### 2. 设置图片大小
```java
// 根据 ImageView 大小加载
.override(200, 200)
```
### 3. 处理加载失败
```java
.error(R.drawable.error)
.fallback(R.drawable.fallback)
```
---
## 面试常见问题
### Q1: Glide 的缓存机制?
**答案:**
- 三级缓存:活动资源、内存、磁盘
- LRU 算法管理缓存
- 自动管理内存
### Q2: Glide 和 Picasso 的区别?
**答案:**
- **Glide**:功能更丰富,内存管理更好
- **Picasso**更轻量API 更简单
### Q3: Glide 如何避免内存泄漏?
**答案:**
- 使用生命周期感知
- 自动取消请求
- 及时释放资源
---
*最后更新2024年*