rxjava订阅的一种方式是挂起而一个不挂起,为什么?

时间:2014-10-24 14:01:29

标签: rx-java

我有一条特殊的可观察链条挂在我身上。经过一些研究后,我发现用一个带有onNext的变体替换subscribe(subscriber)可以解决这个问题。两者之间的唯一区别是,在挂起的变体中,我的订阅者被包装到SafeSubscriber中,该订阅者取消订阅onCompleted。尽管如此,我不明白为什么它会挂起。有人可以向我解释这个问题或者指点我吗?

此代码挂起:

Scheduler sch = Schedulers.from(Executors.newSingleThreadExecutor());

Observable
    .create(subscriber -> Observable.just(null).subscribe(subscriber))
    .flatMap(ignored -> Observable.just(null).observeOn(sch))
    .toBlocking()
    .first();

这不是:

Scheduler sch = Schedulers.from(Executors.newSingleThreadExecutor());

Observable
    .create(subscriber -> Observable.just(null).subscribe(value -> subscriber.onNext(value)))
    .flatMap(ignored -> Observable.just(null).observeOn(sch))
    .toBlocking()
    .first();

构造可能看起来很奇怪,但请注意我试图将其简化为最简单的再现问题的示例。实际上它要复杂得多。

1 个答案:

答案 0 :(得分:1)

问题是subscriber -> Observable.just(null).subscribe(subscriber)。 永远不要重复使用subscriber,因为它是有状态的。传递给Subscriber的{​​{1}}已经Observable.onSubscribe d。别再打电话给subscribe。如果您发现需要在subscribe中致电subscribe,则应考虑使用Observable.onSubscribe