Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Различие между subscribeOn и observeOn методами

#rxjava


В чём заключается различие между subscribeOn и observeOn методами?

Правильно ли я его понимаю? 

Вот то, как я это понимаю: subscribeOn определяет поток по умолчанию для Observable
после его создания (в случае, если его нужно выполнять не в текущем потоке), т.о.,
начинаться выполнение будет всегда в потоке, определённом subscribeOn. И поэтому subscribeOn
нужен только один (если будет несколько subscribeOn, выполнится только первый). А observeOn
после может поменять поток, начиная с места вызова, и сколько будет observeOn, столько
раз будет меняться поток.
    


Ответы

Ответ 1



Нашла полезную статью, которая содержит точный ответ насчёт количества и места вызова данных методов. Надеюсь, поможет кому-нибудь ещё. По поводу subscribeOn() The subscribeOn() operator will have the same effect no matter where you place it in the observable chain; however, you can't use multiple subscribeOn() operators in the same chain. If you do include more than one subscribeOn(), then your chain will only use the subscribeOn() that’s the closest to the source observable. Что значит: Оператор subscribeOn() будет иметь тот же эффект независимо от того, где вы поместите его в цепочку observable; однако вы не можете использовать несколько операторов subscribeOn() в одной цепочке. Если вы включили в цепочку более одного subscribeOn(), ваша цепочка будет использовать только subscribeOn(), который ближе всего к observable источнику. subscribeOn(), который ближе всего к Observable источнику - это первый в цепочке, и данное утверждение было также проверено опытным путём, например, если есть цепочка: observable .subscribeOn(Schedulers.newThread()) .subscribeOn(Schedulers.computation()) .subscribe(observer); то onNext() каждого элемента выполняется в потоке RxNewThreadScheduler-1 (потоке, созданном Schedulers.newThread()), а цепочка observable .subscribeOn(Schedulers.computation()) .subscribeOn(Schedulers.newThread()) .subscribe(observer); передаёт выполнение onNext() каждого элемента в поток RxComputationThreadPool-1 (поток, созданном Schedulers.computation()). По поводу observeOn() Unlike subscribeOn(), where you place observeOn() in your chain does matter, as this operator only changes the thread that’s used by the observables that appear downstream. For example, if you inserted the following into your chain then every observable that appears in the chain from this point onwards will use the new thread. .observeOn(Schedulers.newThread()) This chain will continue to run on the new thread until it encounters another observeOn() operator, at which point it’ll switch to the thread specified by that operator. You can control the thread where specific observables send their notifications by inserting multiple observeOn() operators into your chain. Что значит: В отличие от subscribeOn(), имеет значение, куда в цепочку вы помещаете функцию observeOn(), так как этот оператор только изменяет поток, который используется observables, которые следуют ниже. Например, если вы вставляете в свою цепочку следующий код, то каждый observable, который появляется в цепочке с этого момента, будет использовать новый поток. .observeOn(Schedulers.newThread()) Эта цепочка будет продолжать работать в новом потоке, пока не встретится другой оператор observOn(), после чего она переключится на поток, указанный этим оператором. Вы можете управлять потоком, куда конкретные observables отправляют свои уведомления, путём вставки в вашу цепочку нескольких операторов observeOn().

Комментариев нет:

Отправить комментарий