# EventBus原理

## 目录
- [EventBus原理](#eventbus原理)
- [事件总线](#事件总线)
- [订阅机制](#订阅机制)
- [线程模式](#线程模式)
- [EventBus源码分析](#eventbus源码分析)
- [EventBus最佳实践](#eventbus最佳实践)
- [面试常见问题](#面试常见问题)

---

## EventBus原理

### 定义

```java
// EventBus：事件总线
// 基于观察者模式
// 组件间解耦通信
```

### 核心概念

```java
// 1. Event：事件
// 2. Subscriber：订阅者
// 3. Publisher：发布者
```

---

## 事件总线

### 架构

```java
// EventBus 使用单例模式
// 维护订阅者列表
// 事件发布时，通知所有订阅者
```

---

## 订阅机制

### 订阅事件

```java
// 注册订阅者
EventBus.getDefault().register(this);

// 订阅方法
@Subscribe
public void onEvent(MessageEvent event) {
    // 处理事件
}

// 注销订阅者
EventBus.getDefault().unregister(this);
```

### 发布事件

```java
// 发布事件
EventBus.getDefault().post(new MessageEvent("Hello"));
```

---

## 线程模式

### 线程模式类型

```java
// 1. POSTING：发布线程（默认）
@Subscribe(threadMode = ThreadMode.POSTING)

// 2. MAIN：主线程
@Subscribe(threadMode = ThreadMode.MAIN)

// 3. BACKGROUND：后台线程
@Subscribe(threadMode = ThreadMode.BACKGROUND)

// 4. ASYNC：异步线程
@Subscribe(threadMode = ThreadMode.ASYNC)
```

---

## EventBus源码分析

### 关键类

```java
// EventBus：事件总线
// SubscriberMethodFinder：订阅方法查找
// Subscription：订阅信息
```

### 关键流程

```java
// 1. register()：注册订阅者
// 2. findSubscriberMethods()：查找订阅方法
// 3. post()：发布事件
// 4. postToSubscription()：通知订阅者
```

---

## EventBus最佳实践

### 1. 及时注销

```java
@Override
protected void onDestroy() {
    super.onDestroy();
    EventBus.getDefault().unregister(this);
}
```

### 2. 使用合适的线程模式

```java
// 根据需求选择线程模式
@Subscribe(threadMode = ThreadMode.MAIN)
```

---

## 面试常见问题

### Q1: EventBus 的原理？

**答案：**
- 基于观察者模式
- 维护订阅者列表
- 事件发布时通知所有订阅者

### Q2: EventBus 的线程模式？

**答案：**
1. POSTING：发布线程
2. MAIN：主线程
3. BACKGROUND：后台线程
4. ASYNC：异步线程

### Q3: EventBus 的优缺点？

**答案：**
- **优点**：解耦、易用
- **缺点**：可能内存泄漏、难以追踪

---

*最后更新：2024年*
