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