我对.subscribeOn()
对RxJava
的实际工作方式感到有些好奇。
我有这段代码按预期工作:
return endpoints.getRecentConversations(page)
.map().flatMap().doOnNext() //etc etc...
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
我正在阅读this文章,试着了解subscribeOn
和observeOn
之间的区别,这条线引起了我的注意:
排名无关紧要
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
答案 0 :(得分:0)
是的,这个位置在RxJava中确实很重要,它被称为上游&下游。
这是因为您订阅了一个热门的观察者 观看此视频以更好地理解它:常见的RxJava错误 https://www.youtube.com/watch?v=QdmkXL7XikQ&t=768s
有两种类型的可观察物:Hot&冷。
“热”的Observable可能会在创建项目后立即开始发出, 因此,任何后来订阅该Observable的观察者都可以开始 观察中间某处的序列。一个“冷”的观察者, 另一方面,等到观察者在它之前订阅它 开始发射物品,所以这样的观察者保证会看到 整个序列从一开始。