RxJava中与RxSwift的Variable/BehaviorRelay等价的内置组件是什么?
嘿,这个问题我刚好踩过坑,来给你掰扯清楚:
对应RxSwift Variable/BehaviorRelay的最佳RxJava组件
最贴合的其实是RxRelay库中的BehaviorRelay。它和RxSwift里的BehaviorRelay(以及被废弃的Variable,Variable本质是封装了BehaviorSubject但屏蔽了终止方法)的行为完全对齐:
- 会始终保留最新的一个值
- 新订阅者一订阅就会收到当前的最新值
- 永远不会发送
onError或onComplete事件,也就不会进入终止状态
BehaviorSubject和它们的表现差异
BehaviorSubject和BehaviorRelay确实很像,但不完全一致。核心区别在于:
BehaviorSubject是标准的RxJava Subject,它允许调用onError()或onComplete()方法。一旦调用了这两个方法,BehaviorSubject就会进入终止状态,后续的订阅者会直接收到这个终止事件,再也接收不到新的next事件。
而RxSwift的Variable/BehaviorRelay是被设计成永远不会终止的,所以如果用BehaviorSubject替代,不小心触发了终止逻辑,就会和原组件的预期行为产生偏差。
RxRelay是不是唯一替代选择
不是唯一选择,但绝对是最省心的选择。
如果你不想引入RxRelay库,也可以自己封装一个BehaviorSubject:写一个类包裹BehaviorSubject,对外只暴露类似accept(T value)的方法(用来发送next事件),把onError()和onComplete()方法隐藏起来,不让外部调用。但这样需要自己维护这个封装类,还要处理线程安全等细节,不如直接用RxRelay现成的实现来得稳妥。
内容的提问来源于stack exchange,提问作者Nominalista
相关产品推荐
相关产品推荐

