앱 개발자로 취업준비를 하면, 요구사항이나 우대사항에 RxJava(iOS는 RxSwift)를 자주 본다.
그래서 Kotlin 언어로 RxJava를 사용하는 방법을 익혀보자.
RxKotlin, RxAndroid 등 좀더 특화된 라이브러리도 있지만, 기본은 RxJava다.
개인적으로 처음부터 완벽히 이해하기보다는 예제를 통해 점차 이해도를 높이는 방식을 선호한다.
뭐라는지 잘 몰라도 결국 예제를 따라하다 보면 조금씩 이해할 수 있을 것이다.
그래서 쉬운 예제 무작정 따라하기 ==> 점차 이해도 높이기 방식으로 공부해보자.
dependencies {
...
implementation "io.reactivex.rxjava2:rxkotlin:2.4.0"
...
}
fun main() {
Observable // 생산자 : 데이터를 생산하여 전달
.just("Hello?", "RxJava!?") // 생성 연산자
.map { it.dropLast(1) } // 변환 연산자 : 데이터의 가공 (뒷자리 하나 제거)
.subscribe(::println) // 소비자 : 데이터를 받아서 처리 (println)
}
결과
1. 전달한 "Hello?", "RxJava!?"에서
2. dropLast(1)하여 "Hello"와 "RxJava!"가 전달되어
3. 전달된 두 문자열을 println함수를 통해 출력한 모습이다.
val observer = object : Observer<Int> {
override fun onComplete() {
// Observable이 완료된 경우
}
override fun onSubscribe(d: Disposable) {
// Observable이 데이터 전달할 준비가 되었을 때.
// 작업 취소를 위한 Disposable에 대한 레퍼런스를 여기서 받음
}
override fun onNext(t: Int) {
// Observable이 데이터를 전달할 때 호출
}
override fun onError(e: Throwable) {
// Observable이 에러를 전달할 때 호출. Error시 Complete없이 종료다.
}
}
Observable.just(1, 2, 3, 4).subscribe(observer)
val disposable: Disposable = Observable.just(1, 2, 3, 4)
.subscribe(
{ println("onNext $it") }, // onNext: Consumer
{ println("onError") }, // onError: Consumer
{ println("onComplete") }, // onComplete: Consumer
{ println("onSubscribe") } // onSubscribe: Consumer
)
val observer = Observable.just(11, 12, 13)
.map {
if (it == 12) throw IllegalStateException() // 12에 에러
else it
}
observer.subscribe(
{ println("onNext $it") },
{ println("onError") },
{ println("onComplete") },
{ println("onSubscribe") })
Single.just(1)
.subscribe(
{ println("onSuccess $it") },
{ println("onError") }
)
Completable.complete()
.subscribe(
{ println("onComplete") },
{ println("onError") }
)
Maybe.empty<Unit>()
.subscribe(
{ println("onSuccess $it") },
{ println("onComplete") },
{ println("onError") }
)
Flowable.just(1, 2, 3, 4)
.subscribe(
{ println("onNext $it") }, // onNext: Consumer,
{ println("onError") }, // onError: Consumer,
{ println("onComplete") }, // onComplete: Consumer,
{ println("onSubscribe") } // onSubscribe: Consumer
)
val xSubject = 종류별Subject.create<Int>()
xSubject.subscribe { println("첫번째 $it") }
xSubject.onNext(1)
Thread.sleep(1000L)
xSubject.subscribe { println("----두번째 $it") }
xSubject.onNext(2)
xSubject.onNext(3)
Thread.sleep(1000L)
xSubject.subscribe { println("********세번째 $it") }
xSubject.onNext(4)
xSubject.onComplete()
val compositeDisposable = CompositeDisposable()
compositeDisposable.addAll( // 한개만 등록시 add
Observable.just(1).subscribe(),
Single.just(1).subscribe(),
Maybe.just(1).subscribe()
)
compositeDisposable.clear() // 작업이 도중 취소된다.
// dispose()도 있지만 그러면 CompositeDisposable을 더이상 못쓴다.
다음 시간에는 여러가지 연산자들을 알아보고, 가능하면 간단한 안드로이드 적용 예제를 살펴보겠다.