В чем разница между наблюдателем и подписчиком?
Я пытаюсь расшифровать следующую функцию:
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/ но он только упомянул наблюдателя мимоходом, сказав, что вы будете использовать абонента большую часть времени для потребительских товаров, испускаемых из наблюдаемого.
может кто-нибудь объяснит мне
- что такое наблюдатель?
- чем наблюдатель отличается от a подписчик?
- что делает приведенный выше фрагмент кода?
документация сделал его похожим на подписчика. Javadoc для подписчика говорит, что он реализует observer и подписку. Я очень смущен.
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
, и может включать, чтобы попасть в некоторые ловушки, такие как:
- тратить ресурсы на функциональность вы не будете использовать
- не может наследовать от другого класса
- написать неверный код un-подписки
- копировать/вставить код неправильный код или правильный код написано для другого контекста
(Edit: это, по-видимому, верно только для RxJava 1.)
An
Observer
- Это объект, который может получать данные из источника данных (Observable
). Источник данных передает данные в него, вызывая объект наблюдателяonNext()
.A
Subscriber
- этоObserver
который также может отписаться от этого источника данных (черезSubscription
интерфейс).The
getCar()
функция пытается вернуть автомобили, но нет прямого метода сделать это. Но есть функция для получения деталей автомобиля (getCarDetails()
) который вызовет наблюдателя со всеми деталями автомобиля. Поэтому он вызывает эту функцию и передает ее наблюдателю, который, когда он получает данные, будет извлекать данные автомобиля из деталей и передавать их своему собственному наблюдателю.
В RxJava 2
org.reactivestreams.Subscriber
- это интерфейс, соответствующий спецификация реактивных потоков.главное отличие от
Observable
что новогоSubscriber
поддерживает противодавление.
Observer
подписывается наObservable
иSubscriber
подписанFlowable
(реализующийorg.reactivestreams.Publisher
).смотрите подробное описание здесь.
и в RxJava2, если вы хотите иметь возможность отказаться от подписки, вы должны использовать
ResourceObserver
наObservable
иResourceSubscriber
наFlowable
.проверить это вопрос