2017년 6월 4일 일요일

[STUDY] RxAndroid Part 6 (Subject 사용 - PublishSubject/BehaviorSubject)

[목차]==================================================
1. PublishSubject
2. BehaviorSubject
3. ReplaySubject
4. AsyncSubject
======================================================


Subject 는 Observable + Subscriber 로 종종 표현되고는 합니다만, 정확한 표현은 아니라고 생각합니다. (왜냐하면 일반적인 Subscriber 처럼 subscribe()에 직접 사용되는 경우는 거의 없습니다.)
물론 Subject 는 Observable 과 Subscriber 를 모두 implementation 하고 있으니 틀린 이야기는 아닙니다만,
저는 Subject 는 이벤트를 전달받아 구독자들에게 이벤트를 전파하는 중간다리라고 하는게 좀 더 정확한 표현이라고 생각합니다.
onNext()로 전달받은 이벤트를 구독자들에게 전파하며, onCompleted()나 onError()를 받으면 이것 역시 구독자들에게 전파하고 Observable로의 역할을 종료하게 됩니다.
Android 에서는 EventBus 와 같은 형태로도 사용이 가능합니다. 즉 RxJava 를 사용하면 다른 EventBus 라이브러리가 불필요해집니다.
EventBus 언급을 한것에서 살짝 힌트를 받으셨겠지만 Subject 들은 보통 onCompleted 와 같이 종료하는 과정이 없이, 액티비티 라이프사이클(또는 앱 라이프사이클)과 동일하게 살아서 이벤트를 전파하는 역할로 자주 사용됩니다.
여기서는 PublishSubject 와 BehaviorSubject 만 언급하고 넘어가겠습니다만, 다른 Subject 들도 무척 유용하니 기회가 된다면 한번씩 사용해보시는걸 권장해드립니다.

1. PublishSubject
PublishSubject 를 구독한 시점으로부터 이후에 발생하는 이벤트들을 전달받음
     public void publishSubject() {
        PublishSubject<String> subject = PublishSubject.create();
        subject.onNext("첫번째 호출");
        subject.onNext("두번째 호출");

        subject.subscribe(text -> {
            System.out.println("onNext : " + text);
        });

        subject.onNext("세번째 호출");
        subject.onNext("네번째 호출");
    }
     // 결과
    onNext : 세번째 호출
    onNext : 네번째 호출


2. BehaviorSubject
BehaviorSubject 는 PublishSubject 와 비슷합니다만, 구독전에 한건이라도 이벤트가 발생했다면 구독시점에 해당 이벤트도 같이 전달받음
가장 최근에 관찰된 아이템과 그 후에 관찰된 나머지 아이템을 구독하는 옵저버에게 발행

     public void behaviorSubject() {
        BehaviorSubject<String> subject = BehaviorSubject.create();
        subject.onNext("첫번째 호출");
        subject.onNext("두번째 호출");
        subject.subscribe(text -> {
            System.out.println("onNext : " + text);
        });
        subject.onNext("세번째 호출");
        subject.onNext("네번째 호출");
    }
     // 결과
    onNext : 두번째 호출
    onNext : 세번째 호출
    onNext : 네번째 호출


3. ReplaySubject
관찰한 모든 아이템을 버퍼에 저장하고 구독하는 옵저버에게 재생
(보완필요)

4. AsyncSubject
옵저버블이 완료됐을 때 구독하고 있는 각 옵저버에게 관찰한 마지막 아이템만을 발행
(보완필요)



출처 : 인터넷에서 RxAndroid 검색하여 필요한 정보를 다양한 사이트에서 종합하여 작성된 것입니다. 많은 사이트 내용을 종합하여 공부하여 작성하다보니 일일이 나열하지 못하였습니다. ㅈㅅ(_ _) 이글은 자유롭게 퍼 가셔서 도움이 되었으면 좋겠습니다. 감사합니다

댓글 없음:

댓글 쓰기