2. Subject<T, R>
• Observable<R>을 상속받음.
• Observer<T>를 구현.
• 추상 클래스
• hasObservers - 서브스크라이브 되는 여부
• toSerialized - SerializedSubject로 래핑해서
여러 스레드에서 OnXXX를 호출해도 안전.
dalinaum@gmail.com
3. SerializedSubject<T, R>
• 생성자 - Observable.subscribe가 호출될 때
수행되는 OnSubscribe<R>를 정의.
dalinaum@gmail.com
super(new OnSubscribe<R>() {
@Override
public void call(Subscriber<? super R> child) {
actual.unsafeSubscribe(child);
}
});
4. OnSubscribe.call()
• Observable의 unsafeSubscribe 호출.
dalinaum@gmail.com
public final Subscription unsafeSubscribe(Subscriber<? super T> subscriber) {
try {
// new Subscriber so onStart it
subscriber.onStart();
// allow the hook to intercept and/or decorate
RxJavaHooks.onObservableStart(this, onSubscribe).call(subscriber);
return RxJavaHooks.onObservableReturn(subscriber);
} catch (Throwable e) {
...
}
}
5. dalinaum@gmail.com
public final Subscription unsafeSubscribe(Subscriber<? super T> subscriber) {
try {
// new Subscriber so onStart it
subscriber.onStart();
// allow the hook to intercept and/or decorate
RxJavaHooks.onObservableStart(this, onSubscribe).call(subscriber);
return RxJavaHooks.onObservableReturn(subscriber);
} catch (Throwable e) {
...
}
}
9. SerializedObserver
• 여러 스레드에서 onCompleted, onError,
onNext를 호출할 수 있게 도와주는 래퍼.
• 내부에 리스틀 두어 쌓아두는 형태.
• 리스트를 추가하거나 가져올 때
synchronized(this) 블록을 사용.
dalinaum@gmail.com
10. PublishSubject<T>
• SubjectSubscriptionManager<T>를 이용함.
• 상태 관리
• Subject 구현에 필요한 OnSubcribe 로직 제
공 (call 메서드를 통해)
• subscribe를 SubjectObserver로 포장하여
subscribers에 등록.
• unsubscribe에 필요한 로직을 등록.
• onStart, onAdded, onTerminated등 호출.
• SubjectObserver를 내포 클래스로 가짐.
dalinaum@gmail.com
11. SubjectObserver
• 서브스크라이브에 onNext, onError,
onCompleted 전달.
• emitFirst, emitNext 등의 메서드 제공.
• 단일 큐에 onNext, onError, onCompleted를
emit하기 위한 유틸리티 NotificationLite<T>
• 열거를 위한 Object 인스턴스
ON_COMPLETED_SENTINEL,
ON_NEXT_NULL_SENTINEL
• 에러를 위한 래퍼 OnErrorSentinel
dalinaum@gmail.com