OnSubscribe位置导致OnComplete事件过早触发

时间:2017-01-13 18:46:06

标签: android rx-java rx-android

我对.subscribeOn()RxJava的实际工作方式感到有些好奇。 我有这段代码按预期工作:

 return endpoints.getRecentConversations(page)
                .map().flatMap().doOnNext() //etc etc...
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread()) 

我正在阅读this文章,试着了解subscribeOnobserveOn之间的区别,这条线引起了我的注意:

  

排名无关紧要

     

subscribeOn可以放在流中的任何位置,因为它会影响   只有订阅时间

听起来很不错。但我觉得有点怀疑我决定测试它。所以我改变了上面的代码(切换第2行和第3行):

 return endpoints.getRecentConversations(page)
                .subscribeOn(Schedulers.io())
                .map().flatMap().doOnNext() //etc etc...
                .observeOn(AndroidSchedulers.mainThread()) 

结果,我的订阅者过早onComplete()。永远不会调用onNext(),我的logcat中不会出现错误。

我可以按原样离开,但我想知道为什么会这样。 位置不重要是真的吗?我的代码有问题吗? Here's how my code looks

1 个答案:

答案 0 :(得分:0)

是的,这个位置在RxJava中确实很重要,它被称为上游&下游。

这是因为您订阅了一个热门的观察者 观看此视频以更好地理解它:常见的RxJava错误 https://www.youtube.com/watch?v=QdmkXL7XikQ&t=768s

有两种类型的可观察物:Hot&冷。

  

“热”的Observable可能会在创建项目后立即开始发出,   因此,任何后来订阅该Observable的观察者都可以开始   观察中间某处的序列。一个“冷”的观察者,   另一方面,等到观察者在它之前订阅它   开始发射物品,所以这样的观察者保证会看到   整个序列从一开始。