【Android面试】RxJava专题

发布时间:2026/10/18 16:17:56
【Android面试】RxJava专题 文章目录一、基础原理与核心概念1. 请简述 RxJava 的观察者模式Observer Pattern实现原理与传统的观察者模式有何区别2. Observable / Observer / Subscribe / Disposable 关系RxJava 中的 Observable、Observer、Subscribe、Disposable 分别是什么角色它们之间的关系是怎样的3. 什么是背压Backpressure在 RxJava 中哪些场景会产生背压如何解决4. RxJava 中 Observable 和 Flowable 的本质区别是什么分别适用于什么场景5. 解释 RxJava 的事件发射与接收流程从 subscribe 到 onComplete/onError二、线程调度 Scheduler1. RxJava 中常用的 Scheduler 有哪些如 Schedulers.io ()、AndroidSchedulers.mainThread ()它们的底层实现原理和适用场景是什么2. subscribeOn() 和 observeOn() 的区别是什么多次调用它们时效果如何**三、设计模式与操作符1. RxJava 用到的设计模式 **2. 请列举常用的创建型操作符Create、Just、From、Interval、Defer并说明它们各自的应用场景和区别。3. map 和 flatMap 的区别是什么在实际开发中如何选择请结合具体业务场景说明。4. concat、merge、zip 这三个组合操作符的执行逻辑有何不同分别适用于什么业务场景5. filter、distinct、skip、take 这类过滤操作符通常用于解决什么问题6. 什么是 compose 操作符它与 lift 的区别是什么如何利用 compose 实现 RxJava 的通用封装如统一线程调度、错误处理7. 如何使用 RxJava 实现网络请求的重试机制Retry请描述实现思路。8. 如何使用 RxJava 实现 防抖Debounce 功能常见的应用场景有哪些如搜索框联想四、内存泄漏与异常1. RxJava 导致内存泄漏的根本原因是什么请从引用关系、生命周期角度分析2.Android Activity/Fragment 中使用 RxJava如何避免内存泄漏列举至少 3 种解决方案。3. CompositeDisposable 的作用是什么为什么要在页面销毁时调用 clear() 或 dispose()4. RxJava 中的异常处理机制是怎样的onError 事件一旦触发整个流会怎样5. doOnError、onErrorReturn、onErrorResumeNext 的区别是什么分别适用于什么异常处理场景6. 如何处理 RxJava 中的未捕获异常五、高级特性与原理1. 分析 RxJava 中 冷 ObservableCold Observable和热 ObservableHot Observable的区别。ConnectableObservable 如何实现热发射2. Subject 在 RxJava 中扮演什么角色有哪些类型如 PublishSubject、BehaviorSubject它们的应用场景是什么3. RxJava 的背压策略BackpressureStrategy有哪几种BUFFER、DROP、LATEST各自的处理逻辑是什么4. 简述 RxJava 中 变换操作符如 flatMap的底层实现原理涉及 lift 与 Operator5. 在复杂的链式调用中如何定位 RxJava 的线程调度问题或内存泄漏问题一、基础原理与核心概念1. 请简述 RxJava 的观察者模式Observer Pattern实现原理与传统的观察者模式有何区别RxJava 基于观察者模式扩展核心是 Observable被观察者与 Observer观察者通过订阅建立关系。区别:RxJava 是事件流支持链式调用、线程切换、异常捕获、背压、操作符组合。传统观察者是一对多同步通知无统一异常处理、无线程调度、无流控制。RxJava支持取消订阅Disposable传统观察者一般需要手动维护集合注销。2. Observable / Observer / Subscribe / Disposable 关系RxJava 中的 Observable、Observer、Subscribe、Disposable 分别是什么角色它们之间的关系是怎样的Observable事件生产者决定什么时候发射事件。Observer事件消费者接收 onNext /onError/onComplete。subscribe订阅方法建立两者关联开始发射事件。Disposable订阅关系的管理接口用于切断订阅、防止内存泄漏。3. 什么是背压Backpressure在 RxJava 中哪些场景会产生背压如何解决背压生产者发射速度远大于消费者处理速度导致事件堆积 OOM。场景高频事件传感器、流数据、大量网络回调。解决RxJava 1.x 通过 Backpressure 模式来解决这个问题而 RxJava 2.x 及之后版本如 RxJava2/3则使用 Flowable 来专门处理背压问题。使用 Flowable 配合 BackpressureStrategy。使用操作符限流sample、throttle、debounce、onBackpressureBuffer 等。降低发射频率或提升消费效率。4. RxJava 中 Observable 和 Flowable 的本质区别是什么分别适用于什么场景答案Observable不支持背压适合事件量可控场景。Flowable支持背压内置缓冲区与丢弃策略适合高频率、大流量数据流。Flowable 下游通过request(n)告诉上游「我能消费多少条」上游不会盲目发射importio.reactivex.rxjava3.core.Flowable;importio.reactivex.rxjava3.core.FlowableSubscriber;importio.reactivex.rxjava3.schedulers.Schedulers;importorg.reactivestreams.Subscription;publicclassFlowableBackPressureDemo{publicstatic voidmain(String[]args)throws InterruptedException{// 上游快速发射1~100速度很快Flowable.range(1,100).subscribeOn(Schedulers.io()).subscribe(new FlowableSubscriberInteger(){privateSubscription subscription;// 初始请求 5 个事件privatefinalint batch5;OverridepublicvoidonSubscribe(Subscription s){System.out.println( onSubscribe开始订阅);subscriptions;// 告诉上游我准备好消费 5 条subscription.request(batch);}OverridepublicvoidonNext(Integer integer){System.out.println(消费integer线程Thread.currentThread().getName());// 模拟消费慢每消费一条休眠300mstry{Thread.sleep(300);}catch(InterruptedException e){e.printStackTrace();}// 每消费完一批再继续拉取下一批if(integer%batch0){System.out.println( 一批消费完毕再请求batch条);subscription.request(batch);}}OverridepublicvoidonError(Throwable t){t.printStackTrace();}OverridepublicvoidonComplete(){System.out.println( 全部完成);}});Thread.sleep(10000);}}演示 4 种常用背压策略Flowable.range(1,1000).onBackpressureBuffer()// 缓存来不及处理的数据.subscribeOn(Schedulers.io()).observeOn(Schedulers.single()).subscribe(v-{Thread.sleep(100);System.out.println(buffer消费v);},Throwable::printStackTrace);Thread.sleep(5000);5. 解释 RxJava 的事件发射与接收流程从 subscribe 到 onComplete/onErrorsubscribe () → 订阅建立 → Observable 发射 onNext → 正常结束 onComplete / 异常onError → 事件终止。一旦 onError /onComplete流终止不再接收事件。二、线程调度 Scheduler1. RxJava 中常用的 Scheduler 有哪些如 Schedulers.io ()、AndroidSchedulers.mainThread ()它们的底层实现原理和适用场景是什么Schedulers.io ()IO 线程池无上限适合网络、数据库、文件。Schedulers.computation ()CPU 密集型线程数 CPU 核心数。AndroidSchedulers.mainThread ()Android 主线程用于更新 UI。Schedulers.newThread ()每次新建线程不推荐频繁使用。2. subscribeOn() 和 observeOn() 的区别是什么多次调用它们时效果如何**subscribeOn指定被观察者执行线程多次调用只有第一次生效。observeOn指定观察者执行线程每次调用都生效可多次切换。三、设计模式与操作符1. RxJava 用到的设计模式 **观察者模式核心订阅分发。装饰器模式几乎所有操作符map/flatMap都是对上游 Observable 包装。适配器模式将各种异步逻辑适配成统一 Observable 流。迭代器模式内部事件序列遍历。策略模式Scheduler、BackpressureStrategy。2. 请列举常用的创建型操作符Create、Just、From、Interval、Defer并说明它们各自的应用场景和区别。just快速发射固定数据。fromArray/fromIterable遍历集合。create自定义发射逻辑需手动处理 Disposable。interval定时循环常用于轮询。defer延迟创建 Observable每次订阅都生成新实例确保获取最新数据。3. map 和 flatMap 的区别是什么在实际开发中如何选择请结合具体业务场景说明。map数据类型转换1:1 返回普通对象。flatMap1:N 转换返回Observable可并发、无序。适用map 做简单转换flatMap 做嵌套请求、多源合并。4. concat、merge、zip 这三个组合操作符的执行逻辑有何不同分别适用于什么业务场景concat串行执行按顺序必须等上一个完成。merge并行执行谁先完成谁先回调无序。zip按个数配对必须等所有源都发射对应事件才回调。5. filter、distinct、skip、take 这类过滤操作符通常用于解决什么问题filter条件过滤。distinct去重。take取前 N 个。skip跳过前 N 个。常用于列表筛选、重复请求拦截、节流。6. 什么是 compose 操作符它与 lift 的区别是什么如何利用 compose 实现 RxJava 的通用封装如统一线程调度、错误处理lift底层操作符针对事件流做转换面向 Observer 包装。compose面向 Observable 整体封装适合统一线程调度、统一错误处理可复用。7. 如何使用 RxJava 实现网络请求的重试机制Retry请描述实现思路。使用 retry /retryWhen配合条件判断网络码、异常类型、次数限制、延迟策略。8. 如何使用 RxJava 实现 防抖Debounce 功能常见的应用场景有哪些如搜索框联想搜索框联想、按钮防重复点击、快速滑动停止后加载。四、内存泄漏与异常1. RxJava 导致内存泄漏的根本原因是什么请从引用关系、生命周期角度分析Observable 持有 Activity/Fragment 引用匿名内部类。异步任务未完成页面已销毁Observer 无法被回收。未取消订阅Disposable 未 dispose。2.Android Activity/Fragment 中使用 RxJava如何避免内存泄漏列举至少 3 种解决方案。使用CompositeDisposable统一管理onDestroy 调用 clear/dispose。使用RxLifecycle绑定生命周期自动解绑。避免匿名内部类持有 Activity 引用使用静态内部类 弱引用。合理使用 takeUntil、autoDispose。3. CompositeDisposable 的作用是什么为什么要在页面销毁时调用 clear() 或 dispose()管理多个 Disposable页面销毁时统一切断所有订阅防止泄漏。4. RxJava 中的异常处理机制是怎样的onError 事件一旦触发整个流会怎样异常会向上游传递触发onError 后整个流终止无法继续接收事件。5. doOnError、onErrorReturn、onErrorResumeNext 的区别是什么分别适用于什么异常处理场景doOnError副作用监听异常不恢复流。onErrorReturn捕获异常发射一个默认值然后正常结束。onErrorResumeNext异常后切换到新 Observable 继续发射。6. 如何处理 RxJava 中的未捕获异常必须实现 Observer 的 onError全局可通过 RxJavaPlugins.setErrorHandler 兜底。五、高级特性与原理1. 分析 RxJava 中 冷 ObservableCold Observable和热 ObservableHot Observable的区别。ConnectableObservable 如何实现热发射冷订阅才开始发射每个订阅者独立事件流如网络请求。热不依赖订阅提前发射多订阅者共享事件如 Subject、事件总线。ConnectableObservable 可将冷流转热publish connect。2. Subject 在 RxJava 中扮演什么角色有哪些类型如 PublishSubject、BehaviorSubject它们的应用场景是什么PublishSubject只接收订阅后事件。BehaviorSubject接收订阅前最后一个 后续事件。ReplaySubject重放历史所有事件。AsyncSubject只接收最后一个事件并在完成时发射。常用于事件总线、跨页面通信。3. RxJava 的背压策略BackpressureStrategy有哪几种BUFFER、DROP、LATEST各自的处理逻辑是什么BUFFER缓存队列可能 OOM。DROP丢弃新事件。LATEST保留最新覆盖旧的。ERROR直接抛 MissingBackpressureException。4. 简述 RxJava 中 变换操作符如 flatMap的底层实现原理涉及 lift 与 Operator通过 lift 包装上游 Observable内部创建新 Observable将每个事件转为新 Observable 并合并发射。5. 在复杂的链式调用中如何定位 RxJava 的线程调度问题或内存泄漏问题线程问题查看 subscribeOn/observeOn 位置。泄漏LeakCanary 检查 Disposable 是否释放。异常打印完整堆栈检查是否遗漏 onError。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询