RxJava-不是上帝,真不推荐再用了

本文分析了RxJava在实际应用中的优点和问题,如BackPressure和过度封装带来的开销,指出它虽强大但并非适合所有场景,提倡根据团队需求选择更为适用的异步框架。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

val stationId = “5bCP6Iqx”
val statoin:Observable = staionRepo.getStationById(stationId)
val stationLine:Observable = station.flatMap{station ->stationRepo.getLine(station)}

return Observable.merge(station.map{it.toUiModel()},stationLine.map{it.toUiModel()})

乍一看,这几行代码并没有错。这个Bug还是后台反馈给我的说为什么android每次都会发两个一模一样的请求? 其实问题就出在stationLine和station并没有共享结果。造成了每次请求都要发两次。 修改后的代码:

val stationId = “5bCP6bif”
val statoin:Observable = staionRepo.getStationById(stationId)

return station.publish{selector ->
Observable.merge(selector.map{it.toUiModel()},
selector.flatMap{station -> stationRepo.getLine(station)}
.map{it.toUiModel()})
}

RxJava还是过于理想化了

RxJava承诺出一个完美的异步世界,一切异步操作由上游控制,下游只需要思考如何处理,并不关心数据来源。 而实际过程中,这个过程还是过于理想化了。最直接的例子就是BackPressure的出现。 在数据量足够庞大时,缓存池并不能及时缓存所有生产的数据,造成越积越多最终OOM。也即是所谓的BackPressure。 再者,函数式中的Monad来包裹异步这个操作还是过于复杂了,看过RxJava的朋友都应该清楚。某些很简单的操作符在实现起来其实非常复杂。追踪数据十分困难,很容易掉入很难Debug的情况。 而且虽然RxJava的文档是我见过少有写的非常出色的库,但是很多操作符如果不读通源码,仅仅从Java Doc和Method Signature来观察,并不清楚期待的行为是什么。就算知道,在一些特殊情况如何处理,仍是一个未知结果。 同时RxJava虽然解放了上游控制权力的,也引入了不安全性。如果上游出现了非预想的问题,下游将很难处理。 其次,RxJava为了这个理想化的世界,引入了太多的overhead。无论是每个操作符都要生成一个新的Observable实例还是蹦床模式的异步解决方案。都生成了太多的Object在堆中存放。这种overhead在轻量级应用,或者一些小型异步处理比如数据埋点等等行为中,都显得过于庞大。

RxJava起于异步,却也不单单是异步

Rx在被Erik Meijer 提出的时候,确实是由同步的Iterable推导,由主动拉取数据改为被动接受数据。 但是在加入函数是Monad的概念之后,RxJava作为响应式数据流,应用在了更多Callback base的场景中。在Android这种GUI平台下尤为出色。 多数基于Redux结构的Android架构都或多或少基于RxJava。或者借鉴RxJava的思想。比如Airbnb推出的MvRx。 还有Google在18年io中当作Sample App做出的Sunflower,大量使用LiveData。而LiveData无疑也是大量借鉴了RxJava的思想。

总结:RxJava虽然优秀,但并不适合所有人

即使RxJava有且不仅限于我说的上述几个问题,但无疑RxJava仍是一个划时代的优秀的异步框架。 但是优秀并不代表适合所有人,我在之前推广RxJava,认为这样的异步基础应该是每一个Android开发者必不可少的知识点。但实际工作使用两年之后,我觉得这并不实际,也不必要。RxJava的水平并不能映射一个Android Dev的开发水平,反之,一个高水平的Android Dev也并不一定对RxJava了解多少。 在这样的前提下,再加上入门门槛高,易出错,行为不好预期等等缺点下。在团队没有RxJava Expert的情况下我更倾向于直接弃用RxJava,转为更容易使用的异步框架和响应式数据流。 我在入职新公司的的时候,邮件里写了这样一句:

engineering is about trade off

RxJava便是这样一个库,甲之蜜糖,乙之砒霜。用的好RxJava,他是一个利器,根本离不开。用不好,他就是你身边的定时炸弹,随时爆炸却又很难拆解。

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。

希望读到这的您能转发分享和关注一下我,以后还会更新技术干货,谢谢您的支持!

转发+点赞+关注,第一时间获取最新知识点

Android架构师之路很漫长,一起共勉吧!


以下墙裂推荐阅读!!!

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

、全套讲解视频、实战项目源码讲义》点击传送门即可获取!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值