[1] RxAndroid 소개
RxAndroid는 RxJava에 최소한의 클래스를 추가하여 안드로이드 앱에서 리액티브 구성 요소를 쉽고 간편하게 사용하게 만드는 라이브러리입니다.
기본적인 UI 핸들링, 비동기 데이터 처리, REST API 라이브러리에 RxJava 비동기 처리
기존 안드로이드에서 발생하는 다음과 같은 문제를
- 안드로이드의 비동기 처리 및 에러 핸들링
- 수많은 핸들러와 콜백 때문에 발생하는 디버깅 문제
- 2개의 비동기 처리 후 결과를 하나로 합성하는 작업
- 이벤트 중복 실행
다음 특징을 통해 해결해준다.
- 간단한 코드로 복잡한 병행(concurrency)프로그래밍을 할 수 있음
- 비동기 구조에서 에러를 다루기 쉬움
- 함수형 프로그래밍 기법도 부분적으로 적용할 수 있음
1. 리액티브 라이브러리와 API
리액티브 API 이름 | 설명 |
RxLifecycle | RxJava 를 사용하는 안드로이드 앱용 라이프 사이클 처리 API. Trello 에서 만듦 |
RxBinding | UI 위젯용 RxJava 바인딩 API |
SqlBrite | SQLiteOpenHelper 와 ContentResolver 클래스의 래퍼 클래스로 쿼리에 리액티브 스트림을 도입함 |
Android-ReactiveLocation | 위치 API 라이브러리(1.x 기준) |
RxLocation | 위치 API 라이브러리(2.x 기준) |
rx-preferences | SharedPreferences 인터페이스 |
RxFit | Fit 라이브러리 |
RxWear | 웨어러블 API 라이브러리 |
RxPermissions | 런타임 권한 라이브러리 |
RxNotification | notification 을 관리하는 API |
RxClipboard | 클립 보드용 RxJava 바인딩 API |
RxBroadcast | Broadcast 및 LocalBroadcast 에 관한 Rxjava 바인딩 API |
RxAndroidBie | 블루투스 LE 장치를 다루기 위한 라이브러리 |
RxImagePicker | 갤러리 또는 카메라에서 이미지를 선택하기 위한 리액티브 라이브러리 |
ReactiveNetwork | 네트워크 연결 상태나 인터넷 연결 상태를 확인하는 라이브러리 |
ReactiveBeacons | 블루투스 LE 기반 비컨을 수신하는 리액티브 라이브러리 |
RxDataBinding | 데이터 바인딩 라이브러리용 RxJava2 바인딩 API |
2. 안드로이드 스튜디오 환경 설정
app build.gradle 설정
dependencies {
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
// rxJava 2.x
implementation 'io.reactivex.rxjava2:rxjava:2.2.7'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
// rxJava 1.x -> 2.x
implementation 'com.github.akarnokd:rxjava2-interop:0.9.1'
// rxlifecycle 2.x : rxJava를 사용하는 안드로이드 앱용 라이프사이클 처리 api
implementation 'com.trello.rxlifecycle2:rxlifecycle:2.1.0'
implementation 'com.trello.rxlifecycle2:rxlifecycle-android:2.1.0'
implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.1.0'
// rxbinding : 안드로이드 UI 위젯용 rxjava 바인딩 api
implementation 'com.jakewharton.rxbinding:rxbinding:1.0.0'
implementation 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
implementation 'com.jakewharton.timber:timber:4.4.0'
// butterknife
implementation 'com.jakewharton:butterknife:10.2.3'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3'
// okhttp
implementation 'com.squareup.okhttp3:okhttp:3.6.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.6.0'
// retrofit
implementation 'com.squareup.retrofit2:retrofit:2.2.0'
implementation 'com.squareup.retrofit2:converter-gson:2.2.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
// Lombok Library
def lombok_ver = "1.18.16"
implementation "org.projectlombok:lombok:$lombok_ver"
annotationProcessor "org.projectlombok:lombok:$lombok_ver"
// volley
implementation 'com.android.volley:volley:1.1.0'
}
dependencies 부분에RxAndroid 라이브러리를 추가해야 합니다. 참고로 RxAndroid는 RxJava에 대한 의존성이 있어 RxJava를 추가하지 않아도 되지만, 최신 버전의 RxJava를 사용하려면 명시해주는 것이 좋습니다.
[2] RxAndroid 기본
RxAndroid의 기본 개념은 RxJava와 동일합니다.
RxJava의 구조에 안드로이드의 각 컴포넌트를 사용할 수 있게 변경해 놓은 것입니다.
따라서 RxAndroid의 구송 요소는 다음처럼 RxJava의 구성 요소와 같습니다.
Observable : 비즈니스 로직을 이용해 데이터 발행
구독자 : Observable에서 발생한 데이터를 구독
스케줄러 : 스케줄러를 통해서 Observable, 구독자가 어느 스레드에서 실행될지 결정
이 과정을 간단한 코드로 나타내면 다음과 같다.
Observable.creat() // 1. Observable 생성
.subscribe(); // 2. 구독자 이용
.subscribeOn(Schedulers.io()) // 3. 스케줄러 이용
.observeOn(AndroidSchedulers.mainThread())
Observable과 구독자가 연결되면 스케줄러에서 각 요소가 사용할 스레드를 결정하는 기본적인 구조이다.
Observable이 실행되는 스레드는 subscribeOn() 함수에서 설정하고
처리된 결과를 onserveOn() 함수에 설정된 스레드로 보내 최종 처리합니다.
RxAndroid 에서 제공하는 스케줄러를 다음과 같다.
스케줄러 이름 | 설명 |
AndroidSchedulers.mainThread() | 안드로이드의 UI 스레드에서 동작하는 스케줄러입니다. |
HandlerScheduler.from(handler) | 특정 핸들러에 의존하여 동작하는 스케줄러 입니다. |
1) Hello world 예제
먼저
2) 제어 흐름
3) RxLifecycle 라이브러리
d
4) UI 이벤트 처리
d
이벤트 리스너
<예제: 추천 검색어 기능>
[3] RxAndroid 활용
1) 리액티브 RecyclerView
RecyclerView 클래스
Adapter 클래스
LayoutManager 클래스
<예제: 설치된 앱 리스트 나열하기>
2) 안드로이드 스레드를 대체하는 RxAndroid
뷰와 뷰 그룹의 스레드 관리
AsyncTask 클래스에 RxAndroid 적용하기
RxAndroid를 이용하여 TimerTask 대체하기
3) REST API를 활용한 네트워크 프로그래밍
Volly 라이브러리 활용
Retrofit2 + OKHttp 활용하기
[4] 메모리 누수
해결책 1: Disposable 인터페이스를 이용함여 명시적으로 자원 해제
해결책 2: RxLifecycle 라이브러리 이용
해결책 3: CompositeDisposable 클래스 이용
참고 : 프로그래밍 리액티브 프로그래밍 기초부터 RxAndroid 까지 한번에 Rxjava 프로그래밍
'Language > Reactive' 카테고리의 다른 글
[리엑티브 생산자 Publisher 3] Single & Maybe & Completable (0) | 2021.06.04 |
---|---|
[리엑티브 생산자 Publisher 2] Flowable & Observable (feat. 배압전략) (0) | 2021.06.04 |
[리엑티브 생산자 Publisher 1] Cold Publisher & Hot Publisher (0) | 2021.06.04 |
Processor와 Subject (0) | 2021.04.25 |
RxJava로 기존 Android code 개선하기 (0) | 2021.04.25 |