在 RxJava 里“提升性能”并不是单点优化,而是从线程调度、背压、操作符选择、内存分配、冷热流设计等多个维度去减少阻塞、减少上下文切换、减少不必要的对象创建。下面按实战优先级总结。
Schedulers 而不是自己 new ThreadObservable.just(1)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
常见选择:
Schedulers.io():IO 密集型(网络、数据库)Schedulers.computation():CPU 密集型(计算)Schedulers.single():单线程串行任务Schedulers.newThread() ❌ 不推荐(线程创建成本高)✅ 原则
observeOn 只在需要切线程时调用❌ 错误示例(频繁切换):
.map(...)
.observeOn(io())
.map(...)
.observeOn(io())
✅ 优化:
.subscribeOn(io())
.map(...)
.map(...)
.observeOn(main())
每次
observeOn/subscribeOn都会带来队列 + 线程切换成本
Flowable 而不是 Observable(高频数据)Flowable.range(1, 1_000_000)
.onBackpressureBuffer()
.observeOn(Schedulers.io())
背压策略:
onBackpressureBuffer()(缓冲)onBackpressureDrop()(丢弃)onBackpressureLatest()(只保留最新)✅ 适用于:
flatMap + 限制并发concatMap(有序)switchMap(只关心最新)flatMap 无限制并发groupBy 后不清理toList() 大集合示例(限制并发):
.flatMap(task -> doTask(task)
.subscribeOn(Schedulers.io()), 4)
❌
.map(i -> new Result(i))
✅
Function 而不是匿名类(减少类加载)Single / Maybe / Completable如果只是:
SingleMaybeCompletable比 Observable 更轻量
publish / replay / shareObservable<Integer> shared =
source.publish().autoConnect();
或:
source.share();
避免重复网络请求 / 重复计算
❌ 无脑重试:
retry(3)
✅ 带退避:
retryWhen(errors ->
errors.delay(1, TimeUnit.SECONDS))
减少瞬间高并发冲击
onErrorReturndoOnNext / doOnSubscribe| 优化点 | 建议 |
|---|---|
| 线程 | 用 Schedulers,少切 |
| 背压 | 高频数据用 Flowable |
| 操作符 | 控制并发 |
| 内存 | 减少对象 |
| 流类型 | 单结果用 Single |
| 热流 | 用 share / replay |
| 错误 | 退避重试 |
如果你愿意,可以告诉我:
我可以直接给你针对性优化方案或代码改写。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。