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年*
|