개발 일기

Rxjava Subject 본문

Client/안드로이드

Rxjava Subject

이건욱

subject

subject란 구독자가 구독하는 순간 데이터를 발행하는 방식에서 구독자가 없어도 데이터를 발행할수 있도록 만들 줄수 있습니다.

 

종류 :)

  • AsyncSubject

  • BehaviorSubject

  • PublishSubject

  • ReplaySubject

AsyncSubject

발행된 데이터중 마지막 데이터만 받습니다.

onComplete 바로 전 마지막 onNext 입력 값을 받습니다.

 

@Test
fun rxSubject(){
       val subject : AsyncSubject<Int> = AsyncSubject.create()

       subject.onNext(1)
       subject.onNext(2)

       subject.subscribe {
           print("첫번째 발행 데이터 : $it\n")
       }

       subject.onNext(3)
       subject.onNext(4)

       subject.subscribe {
           print("두번째 발행 데이터 : $it ")
       }

       subject.onComplete()
}

//결과
첫번째 발행 데이터 : 4
두번째 발행 데이터 : 4 

BehaviorSubject

구독자는 구독 하기 바로 전 부터 데이터를 받습니다. ( 기본 값을 설정을 할수도 있습니다. )

@Test
   fun rxSubject(){
       //val subject : BehaviorSubject<Int> = BehaviorSubject.createDefault(0)
       val subject : BehaviorSubject<Int> = BehaviorSubject.create()
       subject.onNext(1)
       subject.onNext(2)

       subject.subscribe {
           print("첫번째 발행 데이터 : $it\n")
       }

       subject.onNext(3)
       subject.onNext(4)

       subject.subscribe {
           print("두번째 발행 데이터 : $it\n")
       }

       subject.onNext(5)
   }

// 결과
첫번째 발행 데이터 : 2
첫번째 발행 데이터 : 3
첫번째 발행 데이터 : 4
두번째 발행 데이터 : 4
첫번째 발행 데이터 : 5
두번째 발행 데이터 : 5

 

PublishSubject

구독자는 다음 발행 데이터부터 받습니다.

@Test
   fun rxSubject(){
       //val subject : BehaviorSubject<Int> = BehaviorSubject.createDefault(0)
       val subject : PublishSubject<Int> = PublishSubject.create()
       subject.onNext(1)
       subject.subscribe {
           print("첫번째 발행 데이터 : $it\n")
       }
       subject.onNext(2)

       subject.subscribe {
           print("두번째 발행 데이터 : $it\n")
       }

       subject.onNext(3)
   }
   
  // 결과
  첫번째 발행 데이터 : 2
  첫번째 발행 데이터 : 3
  두번째 발행 데이터 : 3

ReplaySubject

구독자는 언제 구독하던 처음부터 데이터를 다 받습니다.

@Test
   fun rxSubject(){
       //val subject : BehaviorSubject<Int> = BehaviorSubject.createDefault(0)
       val subject : ReplaySubject<Int> = ReplaySubject.create()
       subject.onNext(1)
       subject.subscribe {
           print("첫번째 발행 데이터 : $it\n")
       }
       subject.onNext(2)

       subject.subscribe {
           print("두번째 발행 데이터 : $it\n")
       }

       subject.onNext(3)

       subject.subscribe {
           print("세번째 발행 데이터 : $it\n")
       }
   }
   
   // 결과
   첫번째 발행 데이터 : 1
  첫번째 발행 데이터 : 2
  두번째 발행 데이터 : 1
  두번째 발행 데이터 : 2
  첫번째 발행 데이터 : 3
  두번째 발행 데이터 : 3
  세번째 발행 데이터 : 1
  세번째 발행 데이터 : 2
  세번째 발행 데이터 : 3

'Client > 안드로이드' 카테고리의 다른 글

Fragment recyclerView 관련 메모리 이슈  (0) 2020.03.27
ViewModel  (0) 2020.03.27
Broadcast Receiver ?  (0) 2020.03.26
Service  (0) 2020.03.26
paging library ? (페이징 라이브러리)  (0) 2020.03.24
Comments