PublishSubject

5,752 views

Published on

GDG Korea 안드로이드 RxJava 스터디 발표자료

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,752
On SlideShare
0
From Embeds
0
Number of Embeds
606
Actions
Shares
0
Downloads
2
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

PublishSubject

  1. 1. PublishSubject GDG Korea Android RxJava 스터디 dalinuam@gmail.com Leonardo YongUk Kim
  2. 2. Subject<T, R> • Observable<R>을 상속받음. • Observer<T>를 구현. • 추상 클래스 • hasObservers - 서브스크라이브 되는 여부 • toSerialized - SerializedSubject로 래핑해서 여러 스레드에서 OnXXX를 호출해도 안전. dalinaum@gmail.com
  3. 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. 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. 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) { ... } }
  6. 6. dalinaum@gmail.com RxJavaHooks.onObservableStart(this, onSubscribe).call(subscriber); - onObservableStart를 호출하고 OnSubscribe 객체를 (패러미터) 호출.
 return RxJavaHooks.onObservableReturn(subscriber);
 - onObservableReturn을 호출하고 Subscription 객체를 (파라미터) 반환.
  7. 7. Subscribe<T> • Observer<T>와 Subscription을 구현.
 • Observer<T>:
 onCompleted, onError, onNext를 가진 인터 페이스.
 • Subscription:
 unsubscribe와 isUnsubscribed를 가진
 인터페이스. dalinaum@gmail.com
  8. 8. SerializedSubject<T, R> • actual: Subject를 저장. • observer: Subject를 SerializedObserver로 래핑. • 메서드들은 actual이나 observer을 통해 호출. dalinaum@gmail.com
  9. 9. SerializedObserver • 여러 스레드에서 onCompleted, onError, onNext를 호출할 수 있게 도와주는 래퍼. • 내부에 리스틀 두어 쌓아두는 형태. • 리스트를 추가하거나 가져올 때 synchronized(this) 블록을 사용. dalinaum@gmail.com
  10. 10. PublishSubject<T> • SubjectSubscriptionManager<T>를 이용함. • 상태 관리 • Subject 구현에 필요한 OnSubcribe 로직 제 공 (call 메서드를 통해) • subscribe를 SubjectObserver로 포장하여 subscribers에 등록. • unsubscribe에 필요한 로직을 등록. • onStart, onAdded, onTerminated등 호출. • SubjectObserver를 내포 클래스로 가짐. dalinaum@gmail.com
  11. 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
  12. 12. PublishSubject<T> • onNext는 SubjectSubscriptionManager(state)를 통해 SubjectObserver를 거쳐 onNext를 호출. • onCompleted와 onError는 state가 참인 경 우만 emitNext를 통해 호출. dalinaum@gmail.com
  13. 13. Questions? Leonardo YongUk Kim dalinaum@gmail.com lk@realm.io

×