Я пытаюсь расшифровать следующую функцию:
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/, но он лишь мимоходом упомянул Observer, сказав, что вы будете использовать Subscriber большую часть время на предметы потребления, испускаемые Observable.
Кто-нибудь может мне объяснить
- Что такое наблюдатель?
- Чем наблюдатель отличается от подписчика?
- Что делает приведенный выше фрагмент кода?
Javadoc сделал его похожим на подписчика. В javadoc для подписчика говорится, что он реализует наблюдателя и подписку. Я очень смущен.
Ответы:
EDITED : с комментарием @ Alrid
tl; dr
public abstract class Subscriber<T> implements Observer<T>, Subscription
Таким образом, подписчик - это реализация Observer с дополнительной семантикой подписки (это больше касается отмены подписки). Код в вашем вопросе просто показывает, что он передает
Observer
интерфейс, а не реализацию (обычная практика программирования).Также этот код возвращает a
Subscription
, это может быть связано с тем, что автор этого кода считал, что клиент должен иметь доступ только кSubscription
методам, без доступа к элементам, созданным наблюдаемым объектом. Это может быть ошибка программиста.длинная история
На самом деле вам следует прочитать содержимое этого веб-сайта (или книги): http://www.introtorx.com Речь идет о Rx.Net, но концепции те же самые, они были созданы Эриком Мейджером, а разработчики RxJava последовали за ними ( если применимо к языку Java).
Эта страница вас заинтересует (это вторая глава): KeyTypes
Здесь вы прочтете в первых абзацах:
...
Даже если типы / API немного отличаются, вы многому научитесь из этой книги, возможно, намного больше, чем из некоторых блогов.
О чем в этой книге не говорится ( ... потому что это есть в реализации RxJava )
Главный разработчик RxJava в это время представил небольшую вариацию (см. PR # 792 ), которая позволила различать два типа контрактов:
Observer
Subscription
Это изменение позволило лучше выразить / разделить эти проблемы реализующих классов библиотеки RxJava.
Однако для пользователя библиотеки использование реальных реализаций библиотеки RxJava должно быть достаточно хорошим.
Внедрение подписчика требует гораздо больше знаний, работы и внимания, ведь семантика подписки очень важна в зависимости от типа наблюдаемого источника (горячий или холодный? Дорогое создание?)
Предоставление,
Subscriber
а неObserver
в случаях, подобных описанным выше, в большинстве случаев не будет мешать работе кода, но это не его предполагаемое использование, если только эта семантика отмены подписки не требуется. Но, в конце концов, реализацияSubscriber
и может привести к некоторым подводным камням, таким как:источник
(Изменить: это, по-видимому, верно только для RxJava 1.)
An
Observer
- это объект, который может получать данные из источника данных (anObservable
). Источник данных отправляет данные в него, вызывая наблюдателяonNext()
.A
Subscriber
- это объект,Observer
который также может отказаться от подписки на этот источник данных (черезSubscription
интерфейс).getCar()
Функция пытается вернуть автомобили, но нет никакого прямого способа сделать это. Но есть функция для получения информации о машине (getCarDetails()
), которая вызывает наблюдателя со всеми деталями машины. Поэтому он вызывает эту функцию и передает ей наблюдателя, который при получении данных извлекает данные об автомобиле из деталей и передает их своему собственному наблюдателю.источник
В RxJava 2
org.reactivestreams.Subscriber
есть интерфейс, соответствующий спецификации Reactive Streams .Основное отличие от
Observable
новинки в том, что онаSubscriber
поддерживает противодавление.Observer
подписанObservable
иSubscriber
подписанFlowable
(реализуетorg.reactivestreams.Publisher
).См. Подробное описание здесь .
источник
Также в RxJava2 , если вы хотите иметь возможность отказаться от подписки, вы должны использовать
ResourceObserver
forObservable
иResourceSubscriber
forFlowable
.Отметьте этот вопрос
источник