2017-01-13 16 views
0

我對.subscribeOn()實際上在RxJava上的工作方式感到有點好奇。 我有這一塊的,它作爲代碼預期:OnSubscribe位置導致OnComplete事件過早啓動

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

回答

0

是的,這個位置在RxJava中確實很重要,它在下游叫做上游&。

這是因爲你訂閱的熱點觀察的 觀看此視頻,以更好地理解它:常見的誤區RxJava https://www.youtube.com/watch?v=QdmkXL7XikQ&t=768s

有兩種類型的可觀察的:熱冷&。

「熱」可觀察可以立即開始發光的物品,因爲它創建, 誰誰誰稍後訂閱可觀察的任何觀察者可以開始 觀測序列中間的某個位置。另一方面,「冷」Observable, 等待觀察者訂閱它,然後 開始發射物品,因此這樣的觀察者可以保證從頭開始看到整個序列 。

+0

好說話,值得看看謝謝。但是我沒有訂閱熱門的可觀測數據,這是嚴格檢查我的要點。 Dan Lew還在演講中表示.subscribeOn的順序無關緊要。 .observeOn是另一個故事 – feresr

+0

讓我檢查它 –