Подтвердить что ты не робот

Какова цель doOnNext (...) в RxJava

Когда мы должны использовать doOnNext() от Observable, а не только onNext()?

4b9b3361

Ответ 1

doOnNext относится к побочным эффектам: вы хотите реагировать (например, журнал) на выбросы элементов на промежуточном этапе вашего потока, например, до фильтрации потока, для поперечного поведения, такого как ведение журнала, но вы все еще хотите значение для распространения по потоку.

onNext является более окончательным, он потребляет значение.

Ответ 2

ВАЖНОЕ РЕДАКТИРОВАНИЕ: -in жирные символы сразу below-

* Как только вы поймете эту концепцию, я настоятельно рекомендую вам взглянуть на эту ссылку, которая меняет жизнь, и не только потому, что мы используем разные наблюдаемые, такие как Observable, Single, Maybe этого может потребоваться другой инструмент, например, doOnEvent() для Single и doOnEach() для Observable но потому что, если вы хотите отлаживать, есть несколько причин, по которым doOnNext() часто может даже не быть идеальным выбором, потому что мы можем игнорировать другие события, которые имеют отношение к решению проблемы *

ОРИГИНАЛЬНЫЙ ОТВЕТ: -partially modified-

Прежде всего, doOnNext() может вызываться еще больше раз в цепочке операторов между Observable и Subscribe, это дает вам больше возможностей для отладки вашего кода. Из-за своей "потоковой" природы отладку в RXJava непросто, doOnNext() вместо этого облегчает отладку. Для этого вы можете также объединить его с оператором doOnError(). Почему бы не использовать простой onNext()? Поскольку отладка не связана строго с логикой кода, теоретически вы также можете исключить doOnNext() прежде чем doOnNext() к работе.

Действительно важная вещь, которую нужно понять, это то, что при наличии Observable для подписки на длинную цепочку вы можете использовать doOnNext в определенной точке, чтобы увидеть, что оператор возвращает другой:

Например:

Observable.just("Donald", "Duck", "Mickey", "Goofy",
                "Uncle")
                .doOnNext{System.out.println("Here ou will get the strings above:$it ")}
                 .map{it.length}
                 .subscribe { println("Here you will get the numbers of how every string is long: $it") }}

Типичный вариант использования doOnNext() может, например, возникнуть, когда вы хотите кэшировать ответ от сервера, поэтому, например, вы можете использовать map() но также doOnNext(), потому что это позволяет сделать ваш код более читабельным, как вместо этого вы бы поместили простой onNext() который в идеале мог бы быть структурирован, чтобы следовать другим инструкциям. (Это спорно, как и все архитектурные мысли)

Аналогично doOnNext() и для тех же целей отладки, вы можете использовать другие операторы, не doOnNext() пояснений:

doOnSubscribe(), doOnUnsubscribe(), doOnCompleted(), doOnError(), doOnTerminate(), finallyDo(), doOnEach(), doOnRequest()

doOnNext() позволяет вам видеть, что происходит в наблюдаемых (часто очень длинных) цепочках, что действительно важно, так это то, что вы можете шпионить за происходящим через цепочку, не затрагивая какие-либо операции, не делая никаких преобразований (пусть скажем, не совсем то, что Log.d мы используем в императивном, а не реактивном коде). Это причина, почему называется побочным эффектом.

РЕДАКТИРОВАТЬ (из-за вопроса в комментариях):

doOnNext() и вышеприведенный метод - просто обратные вызовы, обращайтесь к этому doOnNext() как говорится в официальной документации

просто изменяет Observable, чтобы он вызывал действие при вызове onNext.

Очень просто, поэтому иногда вызывается для загрузки индикатора выполнения, но также действительно используется в шаблоне репозитория, например, если вы хотите сохранить данные в базе данных или кешировать после вызова, например, дооснащения.

Если вам действительно любопытно изнутри, то методы doSomethingReactive просто вызывают метод method call() (обратный вызов из интерфейса Action) внутри "реального" метода SomethingReactive