Observer
는 연산자(Operator)를 통해 기존 데이터를 참조, 변형하여 Observable
을 생성한다.Observable
이 데이터를 발행하고 Event를 보내면 Observer
는 Observable을 구독(Subscribe)
해 소비(Consume)
자를 생성한다.💡 Observable 클래스는 Observer Patter을 응용한 것이다.
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)
Observable
.just("hi","jrary")
.subscribe(System.out::println)
💡 Co(협동) + routine(루틴)
Coroutine 코드 흐름
1. 사용할 Dispatcher를 결정한다.
2. Dispatcher를 이용해서 CoroutineScope를 만든다.
3. CoroutineScope의 launch 또는 async에 수행할 코드 블록을 넘긴다.
CoroutineScope(IO).launch{
val resultStr = getResultFromApi()
withContext(Main){
textView.text = resultStr
}
}
CoroutineScope(IO).launch{
val resultStr = withTimeoutOrNull(10000) {
getResultFromApi()
}
if(resultStr != null){
withContext(Main) {
textView.text = resultStr
}
}
}
// API 통신의 결과를 반환받는 함수
suspend fun getResultFromApi(): String{
//do something
return RESULT_OK
}
- Coroutine은 RxJava에 비해서 읽기 편한 코드를 제공한다.
- Coroutine은 RxJava에 비해서 초기 러닝 커브가 낮아 이해하는 게 쉽다.
- 많은 Jetpack 라이브러리에 코루틴을 완전히 지원하는 확장 프로그램이 포함되어 있다.
현재 Kotlin과 Coroutine의 사용 점유율이 크게 늘어났다. 이로 인해 기존 RxJava를 사용하는 이유 중 하나였던 자료와 활용사례가 많다는 점, 익숙한 라이브러리라는 장점들의 의미가 사라지고 Kotlin Coroutine의 중요도가 높아졌다. 앞으로는 Coroutine 대신 RxJava를 사용할 이유가 없다고 생각하며, 이 글에서 다루지 못했던 Coroutine의 좀 더 깊은 개념과 실전 활용 방법에 대해서 더 공부하고 싶어졌다. 이전 기술이었던 RxJava를 Coroutine으로 변경하기 위해, 또는 Coroutine을 좀 더 깊게 이해하거나 Coroutine, Thread와의 비교를 위해서 RxJava도 한 번 사용해보며 더 이해해야 할 필요성도 느꼈다.
참고
RxJava와 Kotlin Coroutines 비교해보기
[RxJava] RxJava 이해하기 - 2. Observable
코루틴(coroutine)에 대하여. 1편. 코루틴을 왜 쓸까?
저도 개발자인데 같이 교류 많이 해봐요 ㅎㅎ! 서로 화이팅합시다!