2017-01-13 5 views
0

Мне немного любопытно, как .subscribeOn() работает на RxJava. У меня есть этот кусок кода, который работает как задумано:Позиция OnSubscribe вызывает событие OnComplete преждевременно срабатывать

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() никогда не вызывается и ошибок в моем логарифме нет.

Я могу оставить вещи так, как они были, но я хотел бы знать, почему это происходит. Это правда, что позиция не имеет значения? Это что-то не так с моим кодом? Here's how my code looks

ответ

0

Да, положение имеет большое значение в RxJava, оно называется вверх по потоку & вниз по течению.

Это потому, что вы подписавшись на горячий наблюдаемый Смотреть это видео, чтобы лучше понять его: Общее RxJava Ошибка https://www.youtube.com/watch?v=QdmkXL7XikQ&t=768s

Есть два типа наблюдаемые: Горячие & холода.

А «горячий» Наблюдаемый может начать испускать элементы, как только он будет создан, и поэтому любой наблюдатель, который впоследствии присоединяется к тому, что Наблюдаемому может начать наблюдение последовательности где-то в середине. «Холодный» наблюдаемый, , с другой стороны, ждет, пока наблюдатель не подпишется на него перед ним. начинает излучать элементы, и поэтому наблюдателю гарантированно будет видеть целую последовательность с самого начала.

+0

Отличный разговор, стоит посмотреть спасибо. Но я не подписываюсь на горячие наблюдаемые, это холодная проверка моего суждения. А также Дэн Лью говорит в разговоре, что порядок .subscribeOn не имеет значения. .observeOn - это еще одна история – feresr

+0

Позвольте мне проверить это –