# Picasso原理

## 目录
- [Picasso架构](#picasso架构)
- [图片加载流程](#图片加载流程)
- [缓存机制](#缓存机制)
- [Picasso源码分析](#picasso源码分析)
- [Picasso最佳实践](#picasso最佳实践)
- [面试常见问题](#面试常见问题)

---

## Picasso架构

### 架构图

```
Request → Dispatcher → BitmapHunter → NetworkRequest
    ↓         ↓              ↓
  Memory   Disk          Bitmap
  Cache    Cache         Decode
```

### 核心组件

```java
// 1. Picasso：入口类
// 2. RequestCreator：请求创建器
// 3. Dispatcher：调度器
// 4. BitmapHunter：图片加载器
// 5. Cache：缓存
```

---

## 图片加载流程

### 加载流程

```
1. Picasso.with().load().into()
2. 检查内存缓存
3. 检查磁盘缓存
4. 从网络加载
5. 解码图片
6. 缓存图片
7. 显示到 ImageView
```

### 代码示例

```java
Picasso.get()
    .load(url)
    .placeholder(R.drawable.placeholder)
    .error(R.drawable.error)
    .resize(200, 200)
    .into(imageView);
```

---

## 缓存机制

### 二级缓存

```java
// 1. 内存缓存：LruCache
// 2. 磁盘缓存：OkHttp 缓存
```

### 缓存策略

```java
// 默认缓存策略
// - 内存缓存：自动管理
// - 磁盘缓存：使用 OkHttp 缓存
```

---

## Picasso源码分析

### 关键类

```java
// Picasso：入口类
// RequestCreator：请求创建
// Dispatcher：任务调度
// BitmapHunter：图片加载
```

---

## Picasso最佳实践

### 1. 设置图片大小

```java
// 根据 ImageView 大小加载
.resize(200, 200)
```

### 2. 处理加载失败

```java
.error(R.drawable.error)
```

---

## 面试常见问题

### Q1: Picasso 和 Glide 的区别？

**答案：**
- **Picasso**：更轻量，API 简单，功能基础
- **Glide**：功能丰富，内存管理更好，支持 GIF

### Q2: Picasso 的缓存机制？

**答案：**
- 二级缓存：内存缓存、磁盘缓存
- 使用 LruCache 管理内存缓存

---

*最后更新：2024年*
