PublishSubject
-
Upload
leonardo-yonguk-kim -
Category
Technology
-
view
5.448 -
download
1
Transcript of PublishSubject
PublishSubjectGDG�Korea�Android�RxJava�스터디
Leonardo�YongUk�Kim
Subject<T,�R>• Observable<R>을�상속받음.�• Observer<T>를�구현.�• 추상�클래스�• hasObservers�-�서브스크라이브�되는�여부�• toSerialized�-�SerializedSubject로�래핑해서�여러�스레드에서�OnXXX를�호출해도�안전.
SerializedSubject<T,�R>
• 생성자�-��Observable.subscribe가�호출될�때�수행되는�OnSubscribe<R>를�정의.
super(new�OnSubscribe<R>()�{�
����@Override�����public�void�call(Subscriber<?�super�R>�child)�{���������actual.unsafeSubscribe(child);�����}�
});
OnSubscribe.call()• Observable의�unsafeSubscribe�호출.
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)�{���������...�����}�}
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)�{���������...�����}�}
RxJavaHooks.onObservableStart(this,�onSubscribe).call(subscriber);�-�onObservableStart를�호출하고�OnSubscribe�객체를�(패러미터)�호출.
return�RxJavaHooks.onObservableReturn(subscriber);-�onObservableReturn을�호출하고�Subscription�객체를�(파라미터)�반환.
Subscribe<T>• Observer<T>와�Subscription을�구현.
• Observer<T>:onCompleted,�onError,�onNext를�가진�인터페이스.
• Subscription:unsubscribe와�isUnsubscribed를�가진인터페이스.
SerializedSubject<T,�R>• actual:�Subject를�저장.�• observer:�Subject를�SerializedObserver로�래핑.�
• 메서드들은�actual이나�observer을�통해�호출.
SerializedObserver• 여러�스레드에서�onCompleted,�onError,�onNext를�호출할�수�있게�도와주는�래퍼.�
• 내부에�리스틀�두어�쌓아두는�형태.�• 리스트를�추가하거나�가져올�때�synchronized(this)�블록을�사용.
PublishSubject<T>• SubjectSubscriptionManager<T>를�이용함.�• 상태�관리�• Subject��구현에�필요한�OnSubcribe�로직�제공�(call�메서드를�통해)�• subscribe를�SubjectObserver로�포장하여�subscribers에�등록.�
• unsubscribe에�필요한�로직을�등록.�• onStart,�onAdded,�onTerminated등�호출.�
• SubjectObserver를�내포�클래스로�가짐.
SubjectObserver• 서브스크라이브에�onNext,�onError,�onCompleted�전달.�
• emitFirst,�emitNext�등의�메서드�제공.�• 단일�큐에�onNext,�onError,�onCompleted를�emit하기�위한�유틸리티�NotificationLite<T>�• 열거를�위한�Object�인스턴스�ON_COMPLETED_SENTINEL,�ON_NEXT_NULL_SENTINEL�
• 에러를�위한�래퍼�OnErrorSentinel
PublishSubject<T>• onNext는�SubjectSubscriptionManager(state)를�통해�SubjectObserver를�거쳐�onNext를�호출.�
• onCompleted와�onError는�state가�참인�경우만�emitNext를�통해�호출.
Questions?
Leonardo�YongUk�Kim�[email protected]�