다음 기능을 해독하려고합니다.
Subscription getCar(id, Observer<Car> observer) {
return getCarDetails(id, new Observer<CarDetails> {
@Override
onNext(CarDetails details) {
observer.onNext(details.getCar());
} });
}
http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/ 에서 rxjava에 대한 좋은 소개를 받았지만 통과시 Observer 만 언급했으며 대부분의 구독자를 사용할 것이라고 말했습니다. Observable에서 방출되는 소비자 항목까지의 시간.
누군가 나에게 설명 할 수 있습니까?
- 관찰자는 무엇입니까?
- 관찰자는 구독자와 어떻게 다릅니 까?
- 위의 코드 조각은 무엇을합니까?
Javadoc 은 마치 구독자처럼 보이게 만들었습니다. 구독자를위한 javadoc은 관찰자와 구독을 구현한다고 말합니다. 나 엄청 혼란스러워.
답변
편집 : @Alrid의 코멘트
tl; dr
public abstract class Subscriber<T> implements Observer<T>, Subscription
따라서 Subscriber 는 구독 에 대한 추가 의미 가있는 Observer 의 구현입니다 (구독 취소에 대한 자세한 내용). 귀하의 질문에있는 코드 Observer
는 구현 (일반적인 프로그래밍 관행) 대신 인터페이스를 전달한다는 것을 보여줍니다 .
또한이 코드는를 반환합니다 Subscription
. 이는이 코드의 작성자가 Subscription
observable에 의해 생성 된 요소에 대한 액세스없이 클라이언트가 메서드 에만 액세스해야한다고 생각했기 때문일 수 있습니다 . 프로그래머 오류 일 수 있습니다.
긴 이야기
이 웹 사이트 (또는 책)의 내용을 읽어야합니다. http://www.introtorx.com
Rx.Net에 관한 내용이지만 개념은 매우 동일하며 Erik Meijer와 RxJava 구현자가 그 뒤를 따랐 습니다 ( Java 언어에 해당되는 경우).
이 페이지는 당신의 관심을 끌 것입니다 (두 번째 장입니다) : KeyTypes
여기 첫 번째 단락에서 읽을 것입니다.
Rx로 작업 할 때 이해해야 할 두 가지 주요 유형과 Rx를보다 효과적으로 학습하는 데 도움이되는 보조 유형의 하위 집합이 있습니다. IObserver 및 IObservable은 Rx의 기본 빌딩 블록을 형성하는 반면 ISubject의 구현은 Rx를 처음 사용하는 개발자의 학습 곡선을 줄입니다.
…
본질적으로 Rx는 Observer 패턴의 기초 위에 구축됩니다. .NET은 이미 멀티 캐스트 대리자 또는 이벤트 (일반적으로 멀티 캐스트 대리자)와 같은 Observer 패턴을 구현하는 몇 가지 다른 방법을 제공합니다.
유형 / API가 약간 다르더라도이 책을 통해 많은 것을 배울 수 있습니다. 아마도 일부 블로그보다 훨씬 더 많이 배울 것입니다.
이 책 이 말하지 않는 것 ( … RxJava 구현에 있기 때문에 )
이때 RxJava 메인 개발자는 두 가지 유형의 계약을 구분할 수 있는 약간의 변형 (PR # 792 참조 )을 도입했습니다 .
- 알림->
Observer
- (un) 구독->
Subscription
이 변경으로 인해 RxJava 라이브러리의 구현 클래스에 대한 이러한 우려를 더 잘 표현 / 분할 할 수 있습니다.
그러나 라이브러리 사용자로서 RxJava 라이브러리의 실제 구현을 사용하는 것으로 충분합니다.
구독자를 구현하려면 훨씬 더 많은 지식, 작업 및 관리가 필요합니다. 실제로 구독 의미는 관찰 가능한 소스의 유형에 따라 매우 중요합니다 (핫 또는 콜드? 생성 비용이 많이 듭니까?)
위와 같은 경우가 Subscriber
아닌 노출 Observer
은 대부분의 경우 코드를 방해하지 않지만 구독 취소 의미가 필요하지 않는 한 의도 된 용도가 아닙니다. 그러나 결국,를 구현하면 다음 Subscriber
과 같은 일부 함정에 빠질 수 있습니다.
- 사용하지 않을 기능에 리소스를 소비
- 다른 클래스에서 상속 할 수 없습니다.
- 부정확 한 탈퇴 코드 작성
- 잘못된 코드 또는 다른 컨텍스트 용으로 작성된 올바른 코드 복사 / 붙여 넣기
답변
(편집 : 이것은 분명히 RxJava 1에만 해당됩니다.)
-
는
Observer
데이터 소스 (AN에서 데이터를 얻을 수있는 객체이다Observable
). 데이터 소스는 관찰자의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
for Observable
및 ResourceSubscriber
for 를 사용해야합니다 Flowable
.
이 질문 확인