Files
mkdocs/docs/android面试/开源框架/EventBus原理.md

161 lines
2.5 KiB
Markdown
Raw Normal View History

2026-01-15 11:53:37 +08:00
# 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年*