В чем разница между наблюдателем и подписчиком?


Я пытаюсь расшифровать следующую функцию:

Subscription getCar(id, Observer<Car> observer) {
    return getCarDetails(id, new Observer<CarDetails> {
                             @Override
                             onNext(CarDetails details) {           
                                 observer.onNext(details.getCar());
                             } });
}

Я получил хорошее вступление к rxjava от http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/ но он только упомянул наблюдателя мимоходом, сказав, что вы будете использовать абонента большую часть времени для потребительских товаров, испускаемых из наблюдаемого.

может кто-нибудь объяснит мне

  1. что такое наблюдатель?
  2. чем наблюдатель отличается от a подписчик?
  3. что делает приведенный выше фрагмент кода?

документация сделал его похожим на подписчика. Javadoc для подписчика говорит, что он реализует observer и подписку. Я очень смущен.

4 71

4 ответа:

редактировать: с комментарием @Алрид это

tl; dr

public abstract class Subscriber<T> implements Observer<T>, Subscription

так абонент реализация Обозреватель, С дополнительной семантикой по подписке (это больше о un-подписке). Код в вашем вопросе просто показывает, что он передает Observer интерфейс, а не реализация (обычная практика программирования).

и этот код возвращает Subscription, что может быть потому что автор этого кода думал, что клиент должен иметь доступ только к Subscription методы, без доступа к элементам, производимым наблюдаемым. Это может быть ошибка программиста.

долгая история

на самом деле вы должны прочитать содержание этого сайта (или книги):http://www.introtorx.com Речь идет о Rx.Net, но концепции те же самые, они были созданы Эриком Мейером и RxJava исполнители следовали их (если применимо к языку Java).

эта страница вас заинтересует (это вторая глава):KeyTypes

здесь вы прочтете в первых абзацах:

есть два ключевых типа, чтобы понять при работе с Rx, и подмножество вспомогательных типов, которые помогут вам узнать Rx более эффективно. IObserver и IObservable формируют фундаментальные строительные блоки для Rx, в то время как реализации ISubject уменьшает кривую обучения для разработчиков, новых для Rx.

...

по существу Rx построен на основе модели наблюдателя. .NET уже предоставляет некоторые другие способы реализации шаблона наблюдателя, такие как делегаты многоадресной рассылки или события (которые обычно являются делегатами многоадресной рассылки).

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

что это книги не скажу (...потому что это в реализации RxJava)

главный разработчик RxJava в это время ввел небольшое изменение (см. PR #792), что позволило выделить два типа договоров :

  • уведомления -> Observer
  • (un)подписка ->Subscription

это изменение позволило лучше выразить / разделить это касается реализующих классов библиотеки RxJava.

однако, как пользователь библиотеки, использование фактических реализаций библиотеки RxJava должно быть достаточно хорошим.

реализация подписчика требует гораздо больше знаний, работы и заботы, действительно семантика подписки очень важна в зависимости от типа наблюдаемого источника (горячий или холодный? Дорого создавать ?)


разоблачение Subscriber, а не Observer в таких случаях, как выше не будет вмешиваться в код в большинстве случаев, но он не предназначен для его использования, если только не требуется семантика un-subscription. Но в конце концов реализация Subscriber, и может включать, чтобы попасть в некоторые ловушки, такие как:

  1. тратить ресурсы на функциональность вы не будете использовать
  2. не может наследовать от другого класса
  3. написать неверный код un-подписки
  4. копировать/вставить код неправильный код или правильный код написано для другого контекста

(Edit: это, по-видимому, верно только для RxJava 1.)

  1. An Observer - Это объект, который может получать данные из источника данных (Observable). Источник данных передает данные в него, вызывая объект наблюдателя onNext().

  2. A Subscriber - это Observer который также может отписаться от этого источника данных (через Subscription интерфейс).

  3. The getCar() функция пытается вернуть автомобили, но нет прямого метода сделать это. Но есть функция для получения деталей автомобиля (getCarDetails()) который вызовет наблюдателя со всеми деталями автомобиля. Поэтому он вызывает эту функцию и передает ее наблюдателю, который, когда он получает данные, будет извлекать данные автомобиля из деталей и передавать их своему собственному наблюдателю.

В RxJava 2org.reactivestreams.Subscriber - это интерфейс, соответствующий спецификация реактивных потоков.

главное отличие от Observable что нового Subscriber поддерживает противодавление.

Observer подписывается на Observable и Subscriber подписан Flowable (реализующий org.reactivestreams.Publisher).

смотрите подробное описание здесь.

и в RxJava2, если вы хотите иметь возможность отказаться от подписки, вы должны использовать ResourceObserver на Observable и ResourceSubscriber на Flowable.

проверить это вопрос