【问题标题】:OnSubscribe position causes OnComplete event to fire prematurelyOnSubscribe 位置导致 OnComplete 事件过早触发
【发布时间】:2017-01-13 18:46:06
【问题描述】:

我有点好奇.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

【问题讨论】:

    标签: android rx-java rx-android


    【解决方案1】:

    是的,位置在 RxJava 中很重要,它被称为上游和下游。

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

    有两种类型的 observables:热的和冷的。

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

    【讨论】:

    • 精彩的演讲,值得一看,谢谢。但我并没有订阅一个热门的 observable,这是冷的,请检查我的要点。 Dan Lew 在演讲中还说 .subscribeOn 的顺序无关紧要。 .observeOn 是另一回事
    • 让我检查一下
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多