PublishSubject

13
PublishSubject GDG Korea Android RxJava 스터디 [email protected] Leonardo YongUk Kim

Transcript of PublishSubject

Page 1: PublishSubject

PublishSubjectGDG�Korea�Android�RxJava�스터디

[email protected]

Leonardo�YongUk�Kim

Page 2: PublishSubject

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

[email protected]

Page 3: PublishSubject

SerializedSubject<T,�R>

• 생성자�-��Observable.subscribe가�호출될�때�수행되는�OnSubscribe<R>를�정의.

[email protected]

super(new�OnSubscribe<R>()�{�

����@Override�����public�void�call(Subscriber<?�super�R>�child)�{���������actual.unsafeSubscribe(child);�����}�

});

Page 4: PublishSubject

OnSubscribe.call()• Observable의�unsafeSubscribe�호출.

[email protected]

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

Page 5: PublishSubject

[email protected]

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

Page 6: PublishSubject

[email protected]

RxJavaHooks.onObservableStart(this,�onSubscribe).call(subscriber);�-�onObservableStart를�호출하고�OnSubscribe�객체를�(패러미터)�호출.

return�RxJavaHooks.onObservableReturn(subscriber);-�onObservableReturn을�호출하고�Subscription�객체를�(파라미터)�반환.

Page 7: PublishSubject

Subscribe<T>• Observer<T>와�Subscription을�구현.

• Observer<T>:onCompleted,�onError,�onNext를�가진�인터페이스.

• Subscription:unsubscribe와�isUnsubscribed를�가진인터페이스.

[email protected]

Page 8: PublishSubject

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

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

[email protected]

Page 9: PublishSubject

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

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

[email protected]

Page 10: PublishSubject

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

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

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

[email protected]

Page 11: PublishSubject

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

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

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

[email protected]

Page 12: PublishSubject

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

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

[email protected]