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

161 lines
2.5 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.
# 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年*