自定义Publisher对接RxJava2 Flowable:unsafeCreate与fromPublisher的差异及场景
Flowable.unsafeCreate() vs Flowable.fromPublisher(): 差异与适用场景
我来帮你拆解这两个方法的核心区别,毕竟刚上手自定义Publisher对接RxJava2的时候,确实容易被这两个方法搞懵~
核心差异
1. 安全性与契约校验
Flowable.fromPublisher(Publisher<T>):是RxJava提供的「安全入口」。它首先会校验传入的Publisher是否为null(直接抛NullPointerException),然后会把你的自定义Publisher包装成RxJava内部的Flowable实现。这个包装过程会自动适配RxJava的流契约——哪怕你的自定义Publisher没正确处理背压(比如没响应下游的request(n)),RxJava也会兜底处理(默认用缓存策略暂存数据),避免直接触发异常。Flowable.unsafeCreate(Publisher<T>):如其名,是「不安全的入口」。它不会做任何参数校验(传null直接炸),也不会给你的Publisher加任何包装层。它完全信任你写的Publisher已经严格遵守了RxJava的所有规则:包括正确处理背压、线程安全、订阅/取消逻辑的正确性。一旦你的Publisher有任何不符合契约的地方(比如乱发数据不考虑下游处理能力),会直接导致MissingBackpressureException、内存泄漏甚至线程安全问题,而且RxJava不会帮你擦屁股。
2. 性能开销
fromPublisher因为多了一层包装适配,会带来极其微小的性能损耗——大部分业务场景下完全可以忽略,但在极致性能要求的场景(比如高频实时数据处理),这个开销可能需要考量。unsafeCreate没有任何中间层,性能是最优的,直接把你的Publisher接入RxJava的流体系,没有额外消耗。
各自适用场景
优先用Flowable.fromPublisher()的情况
- 你不确定自己的自定义
Publisher是否完全符合RxJava的流契约(比如背压处理是否严谨)。 - 普通业务场景,想要省心,让RxJava帮你处理基础的适配和兜底。
- 团队协作场景,避免因为个人疏忽写出不符合规范的
Publisher导致流异常。
适合用Flowable.unsafeCreate()的情况
- 你已经反复验证过自定义
Publisher完全遵守RxJava的所有契约,包括背压、线程安全等细节。 - 处于极致性能要求的场景,愿意为了性能放弃RxJava的安全兜底。
- 你是RxJava资深玩家,完全清楚自己的代码会带来什么后果,能承担潜在风险。
举个直观的例子:如果你的自定义Publisher不处理背压,直接疯狂发射10000条数据,用fromPublisher的话RxJava会自动缓存这些数据直到下游处理;但用unsafeCreate的话,下游如果来不及处理,会立刻抛出MissingBackpressureException。
内容的提问来源于stack exchange,提问作者artur
相关产品推荐
相关产品推荐

