【问题标题】:RxJava2 create() cautionRxJava2 create() 注意
【发布时间】:2018-10-17 20:32:14
【问题描述】:

this article 阅读主题#2,很明显正确使用create() 可能涉及几个问题,例如:

  • 取消订阅 Observable 时取消注册回调(不这样做会导致内存泄漏)

  • 仅在订阅者仍处于订阅状态时使用 onNext 或 onCompleted 发出事件

  • 使用 onError 向上游传播错误

  • 处理背压

但是看到来自 RxJava2 开发人员的示例,例如 this one,其中 create() 在没有任何进一步检查或警告的情况下使用,让我想知道 create() 的问题有多严重?

如果我想要 Subject 可以随时推送一个值,就像那个链接中的那个:

Subject<Integer> subject = BehaviorSubject.<Integer>create().toSerialized();

Observable<Integer> observable = subject.observeOn(AndroidSchedulers.mainThread());

observable.subscribe(System.out::println);

subject.onNext(1)

可以使用create() 还是也很危险?如何知道何时需要保护create() 排放,何时不需要?

【问题讨论】:

  • 上述文章大约是 1.2.6,而在 RxJava1 中 create 被重命名为 unsafeCreate,它甚至在 RxJava2 中也没有。 Rx2 中的 Observable.create 实际上是 Rx1 中的 Observable.fromEmitter {,它始终可以安全使用。
  • 有趣,我正在查看SingleFromCallable 的源代码,因为它处理了文章中的大部分内容,我认为它仍然有效

标签: rx-java2


【解决方案1】:

Observable.create(OnSubscribe)BehaviorSubject.create() 不同。后者总是安全的,因为它创建了一个最终的预实现 BehaviorSubject,这是一个热门 Observable

Observable.create(OnSubscribe) 用于设置 cold Observable 从头开始,并要求开发人员正确实现整个 observable 协议。它很容易出错,并且在 1.x 后期,create(OnSubscribe) 方法已被弃用。请阅读其javadoc 了解更多详情。

在 RxJava 2 中,create 两种类型的方法都是安全的。

【讨论】:

    猜你喜欢
    • 2017-11-21
    • 2020-07-18
    • 2018-12-28
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 2018-02-06
    • 2019-09-11
    相关资源
    最近更新 更多