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

186 lines
2.9 KiB
Markdown
Raw Normal View History

2026-01-15 11:53:37 +08:00
# RxJava原理
## 目录
- [RxJava概念](#rxjava概念)
- [观察者模式](#观察者模式)
- [操作符](#操作符)
- [线程调度](#线程调度)
- [背压](#背压)
- [RxJava源码分析](#rxjava源码分析)
- [RxJava最佳实践](#rxjava最佳实践)
- [面试常见问题](#面试常见问题)
---
## RxJava概念
### 定义
```java
// RxJava响应式编程库
// - 基于观察者模式
// - 支持异步操作
// - 链式调用
```
### 核心类
```java
// Observable被观察者
// Observer观察者
// Subscriber订阅者
// Scheduler调度器
```
---
## 观察者模式
### 基本使用
```java
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) {
emitter.onNext("Hello");
emitter.onNext("World");
emitter.onComplete();
}
})
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
System.out.println(s);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
```
---
## 操作符
### 常用操作符
```java
// map转换
Observable.just(1, 2, 3)
.map(i -> i * 2)
.subscribe(System.out::println);
// filter过滤
Observable.just(1, 2, 3, 4, 5)
.filter(i -> i % 2 == 0)
.subscribe(System.out::println);
// flatMap扁平化
Observable.just(1, 2, 3)
.flatMap(i -> Observable.just(i * 2))
.subscribe(System.out::println);
```
---
## 线程调度
### Scheduler
```java
// subscribeOn指定上游线程
// observeOn指定下游线程
Observable.create(...)
.subscribeOn(Schedulers.io()) // 在 IO 线程执行
.observeOn(AndroidSchedulers.mainThread()) // 在主线程观察
.subscribe(...);
```
---
## 背压
### 背压问题
```java
// 当生产速度 > 消费速度时,产生背压
// 可能导致内存溢出
```
### 解决方案
```java
// 使用 Flowable
Flowable.create(...)
.onBackpressureBuffer() // 缓冲
.subscribe(...);
```
---
## RxJava源码分析
### 关键类
```java
// Observable被观察者
// Observer观察者
// Scheduler调度器
// Operator操作符
```
---
## RxJava最佳实践
### 1. 及时取消订阅
```java
Disposable disposable = observable.subscribe(...);
disposable.dispose(); // 取消订阅
```
### 2. 使用合适的操作符
```java
// 根据需求选择操作符
// map、filter、flatMap 等
```
---
## 面试常见问题
### Q1: RxJava 的原理?
**答案:**
- 基于观察者模式
- 支持链式调用
- 支持线程调度
### Q2: subscribeOn 和 observeOn 的区别?
**答案:**
- **subscribeOn**:指定上游线程
- **observeOn**:指定下游线程
### Q3: RxJava 的背压?
**答案:**
- 生产速度 > 消费速度时产生
- 使用 Flowable 处理
---
*最后更新2024年*