단비의 개발블로그

[Android] Retrofit 2.0 사용방법 (Kotlin) - 3. RxJava + Retrofit 본문

Android

[Android] Retrofit 2.0 사용방법 (Kotlin) - 3. RxJava + Retrofit

단비냥 2020. 12. 3. 18:18
반응형

 

1. 시작하기 (이전 포스팅)

2. Call 사용하기 (이전 포스팅)

 

이번 포스팅에서는 RxJava와 함께 Retrofit을 사용하는 방법에 대해서 다루겠습니다.

RxJava를 다루자면 끝도 없을 정도로 기능이나 활용방법이 많습니다.

여기에서는 Retrofit과 함께 쓰는 방법을 주로 하여 포스팅해보도록 할게요

 

이 포스팅은 제가 주로 쓰는 방법을 소개할텐데 꼭 이렇게 쓰는 것만이 정답이 아닌

다른 방식으로도 사용할 수 있으므로 참고해주세요! 

 

 

1. Gradle 추가

먼저 app단 build.gradle 파일에 RxJava, Retrofit을 위와 같이 추가해주세요

 

2. Interface 작성

이전 포스팅에서는 메소드의 리턴값를 설정할 때 Call을 사용했었는데,

이번에는 Observable로 아래와 같이 바꿔줍니다

 

RxJava의 기본적인 단위, 이벤트를 발생시키는 주체인 Observable,

RxJava2에서 추가된 Flowable ( Observable을 보완하여 Backpressure handling 지원 ),

하나의 데이터만을 발생시키는 Single 등 여러가지가 있습니다.

 

이런 것들을 공부하는 것만으로도 RxJava의 러닝 커브가 좀 느껴집니다.

각자의 상황에 맞게 사용하시면 되고 여기서는 Observable을 쓰겠습니다.

 

3. 자원 관리

메인 액티비티에서 disposable이라는 변수를 선언해줍니다

disposable 은 메모리 누수 방지를 위해 사용 후 반드시 자원 해제를 해주어야 합니다

위 코드에서는 disposable이 null이 아닐 때 dispose() 시켜줍니다.

 

dispose()는 Observable이 더이상 데이터를 발생시키지 않도록 구독을 해지하는 함수입니다.

Observable 이벤트가 정상적으로 발생했다면 자동으로 dispose()를 호출해 구독자의 관계를 끊지만, 비정상적으로 종료됐을 경우 메모리가 누수되기 때문에 onDestroy()에서 해지시켜줍니다.

 

만약 onCreate() 에서 API 호출을 한다면 onDestroy()에서 해제,

onResume()에서 호출을 한다면 onResume()에서 해제하는 식으로

라이프 사이클에 맞게 해제해 주시면 됩니다.

 

 

4.  API 호출

이제 가장 중요한 API 호출하는 부분입니다!

observeOn은 Observable이 아이템을 전파할 때, 사용할 스레드를 지정합니다.

이 코드에서는 안드로이드 메인스레드를 사용합니다. 

 

subscribeOn은 구독(subscribe)에서 사용할 스레드를 지정합니다.

여기서는 IO 스케줄러를 사용하는데, 네트워크 상의 요청을 처리하거나 각종 입, 출력 작업, DB 쿼리 등을 실행하기 위한 스케줄러입니다.


subscribe에서는 실제로 데이터를 발행합니다.

위의 코드는 코틀린에서 람다식으로 작성되어 많이 함축된 부분이 있는데요,

CTRL+P를 눌러 확인해보면 아래처럼 표시됩니다.

 

 

첫 번째 인자는 onNext, 두 번째는 onError, 세 번째는 onComplete 입니다.

인자를 하나(onNext)만 사용하거나, 두 개(onNext, onError)만 사용할 수도 있습니다.

 

onNext()는 Observable이 데이터를 전달할 때 호출합니다.

저는 API 호출 응답 값을 변수에 저장하는 부분으로 사용하고 있어요

여기서 it에는 ChannelData가 담겨서 오겠죠!

 

onError()는 Observable에서 에러가 발생했을 때 호출됩니다.

서버에서 404 에러 등이 올 경우 이 onError()가 호출되는데 여기서 에러 시 할 동작을 설정해 주시면 됩니다 (토스트 메시지 띄우기, 알림 창 띄우기 등)

it에는 Throwable이 담겨있습니다.

 

onComplete()은 Observable이 완료된 경우에 호출됩니다.

onNext()가 끝난 이후라고 볼 수 있습니다.

저는 여기서 각종 UI 처리, API 응답 값으로 해야 할 처리들을 해주고 있어요

 

5. 마무리

여기까지 제가 Retrofit + RxJava를 사용하는 방법입니다

Retrofit을 모르던 시절 HttpUrlConnection + AsyncTask 를 사용했었는데 그와 비교하면

Retrofit + RxJava를 사용했을 때 API 호출 속도도 확실히 빠르고, 코드의 양이 엄청나게 많이 줄어들었습니다.

익히기까지 공부를 조금 해야 하지만 익숙해지고 나니 속도, 편의성, 가독성의 장점이 두드러집니다.

아직 프로젝트에 적용하지 않으셨다면 꼭 사용해보시는 것을 추천합니다!

반응형
Comments