174 lines
2.8 KiB
Markdown
174 lines
2.8 KiB
Markdown
# 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年*
|