# 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：解码任务
// BitmapPool：Bitmap 对象池
```

---

## 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年*
