我有一条特殊的可观察链条挂在我身上。经过一些研究后,我发现用一个带有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();
构造可能看起来很奇怪,但请注意我试图将其简化为最简单的再现问题的示例。实际上它要复杂得多。
答案 0 :(得分:1)
问题是subscriber -> Observable.just(null).subscribe(subscriber)
。
永远不要重复使用subscriber
,因为它是有状态的。传递给Subscriber
的{{1}}已经Observable.onSubscribe
d。别再打电话给subscribe
。如果您发现需要在subscribe
中致电subscribe
,则应考虑使用Observable.onSubscribe
。