PublishSubject

Post on 06-Jan-2017

5.448 views 1 download

Transcript of PublishSubject

PublishSubjectGDG�Korea�Android�RxJava�스터디

dalinuam@gmail.com

Leonardo�YongUk�Kim

Subject<T,�R>• Observable<R>을�상속받음.�• Observer<T>를�구현.�• 추상�클래스�• hasObservers�-�서브스크라이브�되는�여부�• toSerialized�-�SerializedSubject로�래핑해서�여러�스레드에서�OnXXX를�호출해도�안전.

dalinaum@gmail.com

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);�����}�

});

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)�{���������...�����}�}

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)�{���������...�����}�}

dalinaum@gmail.com

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를�가진인터페이스.

dalinaum@gmail.com

SerializedSubject<T,�R>• actual:�Subject를�저장.�• observer:�Subject를�SerializedObserver로�래핑.�

• 메서드들은�actual이나�observer을�통해�호출.

dalinaum@gmail.com

SerializedObserver• 여러�스레드에서�onCompleted,�onError,�onNext를�호출할�수�있게�도와주는�래퍼.�

• 내부에�리스틀�두어�쌓아두는�형태.�• 리스트를�추가하거나�가져올�때�synchronized(this)�블록을�사용.

dalinaum@gmail.com

PublishSubject<T>• SubjectSubscriptionManager<T>를�이용함.�• 상태�관리�• Subject��구현에�필요한�OnSubcribe�로직�제공�(call�메서드를�통해)�• subscribe를�SubjectObserver로�포장하여�subscribers에�등록.�

• unsubscribe에�필요한�로직을�등록.�• onStart,�onAdded,�onTerminated등�호출.�

• SubjectObserver를�내포�클래스로�가짐.

dalinaum@gmail.com

SubjectObserver• 서브스크라이브에�onNext,�onError,�onCompleted�전달.�

• emitFirst,�emitNext�등의�메서드�제공.�• 단일�큐에�onNext,�onError,�onCompleted를�emit하기�위한�유틸리티�NotificationLite<T>�• 열거를�위한�Object�인스턴스�ON_COMPLETED_SENTINEL,�ON_NEXT_NULL_SENTINEL�

• 에러를�위한�래퍼�OnErrorSentinel

dalinaum@gmail.com

PublishSubject<T>• onNext는�SubjectSubscriptionManager(state)를�통해�SubjectObserver를�거쳐�onNext를�호출.�

• onCompleted와�onError는�state가�참인�경우만�emitNext를�통해�호출.

dalinaum@gmail.com

Questions?

Leonardo�YongUk�Kim�dalinaum@gmail.com�

lk@realm.io