컴퓨터/이론: 개발
[2018.03.17] 37. RxJava Subject 개념과 종류
heepie
2018. 3. 17. 18:03
도입
이번 포스팅에서는 RxJava의 Subject의 개념과 종류에 대해 공부할 예정이다.
개념
(출처 - http://reactivex.io/documentation/subject.html)
Subject는 설명과 같이 Observable과 Observer의 역할을 모두한다.
즉, 자신이 데이터를 발행하고 데이터를 처리 할 수 있다는 것이다.
사용 이유
Hot Observable을 Cold Observable로 변경 가능(아직 와닿지는 않는다.)
Hot Observable을 활용하기 위함이다. 아래 실습을 통해 알아 볼 예정이다.
종류와 실습
Subject는 총 4가지의 종류가 있다.
1. AsyncSubject
- 개념
(출처 - http://reactivex.io/documentation/subject.html)
마블 다이어그램을 확인해보면 AsyncSubject는 구독자에게 onComplete() 함수가 호출되면 마지막 값만 Push한다.
- 실습
| fun AsyncSubj() { val subject = AsyncSubject.create<String>() subject.onNext("1") subject.onNext("2") subject.subscribe { item -> Log.e("heepie", "[Async]Subscriber #1 $item") } subject.onNext("3") subject.subscribe { item -> Log.e("heepie", "[Async]Subscriber #2 $item") } subject.onNext("4") subject.onComplete() } | cs |
|
|
2. BehaviorSubject
- 개념
(출처 - http://reactivex.io/documentation/subject.html)
마블 다이어그램을 확인해보면 BehaviorSubject는 구독자에게 구독 직전의 값부터 Push 한다. 처음부어 구독하는 구독자에게는 Default Value부터 Push 한다.
- 실습
| fun BehavSubj() { val subject = BehaviorSubject.createDefault("Default") subject.onNext("1") subject.onNext("2") subject.subscribe { item -> Log.e("heepie", "[Behav]Subscriber #1 $item") } subject.onNext("3") subject.subscribe { item -> Log.e("heepie", "[Behav]Subscriber #2 $item") } subject.onNext("4") subject.onComplete() } | cs |
|
|
3. PublishSuject
- 개념
(출처 - http://reactivex.io/documentation/subject.html)
마블 다이어그램을 확인해보면 PublishSubject는 구독자에게 구독 이후의 값들을 Push 한다.
- 실습
| fun PubshSubj() { val subject = PublishSubject.create<String>() subject.onNext("1") subject.onNext("2") subject.subscribe { item -> Log.e("heepie", "[Pubsh]Subscriber #1 $item") } subject.onNext("3") subject.subscribe { item -> Log.e("heepie", "[Pubsh]Subscriber #2 $item") } subject.onNext("4") subject.onComplete() } | cs |
|
|
4. ReplaySubject
- 개념
(출처 - http://reactivex.io/documentation/subject.html)
마블 다이어그램을 확인해보면 ReplaySubject는 구독자에게 구독 이전부터 발행한 모든 값을 Push 한다.
- 실습
| fun ReplySubj() { val subject = ReplaySubject.create<String>() subject.onNext("1") subject.onNext("2") subject.subscribe { item -> Log.e("heepie", "[Reply]Subscriber #1 $item") } subject.onNext("3") subject.subscribe { item -> Log.e("heepie", "[Reply]Subscriber #2 $item") } subject.onNext("4") subject.onComplete() } | cs |
|
|
#reactive #subject #rxjava