# RxJava原理 ## 目录 - [RxJava概念](#rxjava概念) - [观察者模式](#观察者模式) - [操作符](#操作符) - [线程调度](#线程调度) - [背压](#背压) - [RxJava源码分析](#rxjava源码分析) - [RxJava最佳实践](#rxjava最佳实践) - [面试常见问题](#面试常见问题) --- ## RxJava概念 ### 定义 ```java // RxJava:响应式编程库 // - 基于观察者模式 // - 支持异步操作 // - 链式调用 ``` ### 核心类 ```java // Observable:被观察者 // Observer:观察者 // Subscriber:订阅者 // Scheduler:调度器 ``` --- ## 观察者模式 ### 基本使用 ```java Observable.create(new ObservableOnSubscribe() { @Override public void subscribe(ObservableEmitter emitter) { emitter.onNext("Hello"); emitter.onNext("World"); emitter.onComplete(); } }) .subscribe(new Observer() { @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年*