본문 바로가기
Rx

안드로이드의 RxJava 활용 - (RxAndroid)

by 봄석 2018. 12. 28.

본 내용은 필자가 학습한 내용을 정리하는 내용입니다.

대부분 의 내용이 아래 책의 내용이므로 원서를 구매해서 직접보시는걸 추천드립니다!

RxJava 프로그래밍 리액티브 프로그래밍 기초부터 RxAndroid까지 한 번에

유동환 , 박정준 지음 | 한빛미디어 | 2017년 09월 04일 출간

http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788968488658&orderClick=LAV&Kc=


저자님의 블로그

https://brunch.co.kr/@yudong#info




RxAndroid란 ?

RxAndroid는 RxJava에 최소한의 클래스를 추가하여 안드로이드 앱에서 리액티브 구성요소를 쉽고 간편하게 사용하게 만드는 라이브러리입니다.


기존 안드로이드 개발에서 가장 어려움을 겪는 문제 중 하나는 복잡한 스레드 사용입니다.

복잡한 스레드 사용으로 발생하는 문제는 다음과 같습니다.


- 안드로이드 비동기 처리 및 핸들링

- 수많은 핸들러와 콜백 때문에 발생하는 디버깅 문제

- 2개의 비동기 처리 후 결과를 하나로 합성하는 작업

- 이벤트 중복 실행


RxAndroid는 습득하기 어려운 부분도 있지만 기존의 안드로이드 개발과 비교했을 때 장점이

많습니다. 다음 특징을 통해 앞 문제를 해결하는데 도움을 줍니다


- 간단한 코드로 복잡한 병행(concurrency) 프로그래밍을 할 수 있습니다.

- 비동기 구조에서 에러를 다루기 쉽습니다.

- 함수형 프로그래밍 기법도 부분적으로 적용할 수 있습니다.


리액티브 라이브러리와 API

RxAndroid는 기본적으로 RxJava의 리액티브 라이브러리를 이용합니다. 안드로이드에서 이용하는 리액티브 API와 라이브러리는 상당히 많습니다. RxJava 1.x 이하 버전에서는 각종 컴포넌트의 이벤트 처리 부분도 하나의 라이브러리에 포함되어 있었습니다.

하지만 경량화 작업과 유지보수 문제로 각 기능을 다른 라이브러리로 분리했습니다.


안드로이드에서 사용할 수 있는 리액티브 API와 라이브러리 목록

 리액티브 API 이름

설명 

 RxLifecycle 

 RxJava를 사용하는 안드로이드 앱용 라이프 사이클 처리 API 입니다. 일정 관리 도구로 유명한 트렐로(Trello)에서 만들었습니다. 

 RxBinding

 안드로이드 UI 위젯용 RxJava 바인딩 API입니다. 

 SqlBrite 

 SQLiteOpenHelper와 ContentResolver 클래스의 래퍼(wrapper)클래스로 쿼리에 리액티브 스트림을 도입합니다.

 Android-ReactiveLocation 

 안드로이드용 리액티브 위치 API 입니다 (RxJava 1.x 기준) 

 RxLocation 

 안드로이드용 리액티브 위치 API 입니다 (RxJava 2.x 기준)

 rx-preferences 

 안드로이드용 리액티브 SharedPreferences 인터페이스입니다. 

 RxFit 

 안드로이드용 리액티브 Fit 라이브러리입니다. 

 RxWear 

 안드로이드용 웨어러블 API 라이브러리입니다. 

 RxPermissions 

 RxJava에서 제공하는 안드로이드 런타임 권한 라이브러리입니다. 

 RxNotification 

 RxJava로 알림(notification)을 관리하는 API입니다. 

 RxClipboard 

 안드로이드 클립보드용 RxJava 바인딩 API입니다. 

 RxBroadcast 

 안드로이드 Broadcast 및 LocalBroadcast에 관한 RxJava 바인딩 API 입니다

 RxAndroidBle 

 블루투스 LE(Bluetooth Low Energy) 장치를 다루기 위한 리액티브 라이브러리 입니다. 

 RxImagePicker 

 갤러리 또는 카메라에서 이미지를 선택하기 위한 리액티브 라이브러리 입니다. 

 ReactiveNetwork 

 네트워크 연결상태나 인터넷 연결상태를 확인하는 리액티브 라이브러리 입니다 (RxJava 1.x 및 RxJava 2.x와 호환) 

 ReactiveBeacons

 주변에 있는 블루투스 LE 기반의 비컨을 수신하는 리액티브 라이브러리 입니다. (RxJava 1.x 및 RxJava 2.x 와 호환) 

 RxDataBInding 

 안드로이드 데이터 바인딩 라이브러리용 RxJava 2 바인딩 API입니다. 



안드로이드 스튜디오 환경설정

안드로이드 스튜디오는 빌드 도구로 그레이들을 이용합니다. 따라서 리액티브 프로그래밍을

사용하려면 그레이들에서 리액티브 프로그래밍을 사용할 수 있도록 설정해야 합니다.


build.gradle 설정

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
 
    //Rx Utils dependencies
    implementation 'io.reactivex.rxjava2:rxjava:2.1.3'
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
 
    //RxLifecycle 2.x
    implementation 'com.trello.rxlifecycle2:rxlifecycle-android:2.1.0'
    implementation 'com.trello.rxlifecycle2:rxlifecycle:2.1.0'
    implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.1.0'
 
    //Utils
    implementation 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
    implementation 'com.jakewharton.timber:timber:4.4.0'
 
    //Utils - butter-knife
    implementation 'com.jakewharton:butterknife:8.8.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
 
}



RxAndroid는 RxJava에 대한 의존성이 있어 RxJava를 추가하지 않아도 되지만, 최신 버전의 RxJava를 사용하려면 명시해주는것이 좋습니다.



RxAndroid의 기본

RxAndroid의 기본 개념은 RxJava와 동일합니다. RxJava의 구조에 안드로이드의 각 컴포넌트를 사용할 수 있게 변경해 놓은 것입니다. 따라서 RxAndroid의 구성 요소는 다음처럼 RxJava의 구성요소와 같습니다


- Observable : 비즈니스 로직을 이용해 데이터를 발행합니다.

- 구독자 : Observable에서 발행한 데이터를 구독합니다.

- 스케줄러 : 스케줄러를 통해서 Observable, 구독자가 어느 스레드에서 실행될지 결정할 수 있습니다.


이러한 과정을 간단한 코드로 나타내면 아래와 같습니다

//1. Observable 생성
Observable.create()
    //2. 구독자 이용
    .subscribe();
 
    //3. 스케줄러 이용
    .subscribeOn(Schedulers.io())

    .observeOn(AndroidSchedulers.mainThread())



Observable과 구독자가 연결되면 스케줄러에서 각 요소가 사용할 스레드를 결정하는 기본적인 구조입니다. Observable이 실행되는 스레드는 subscribeOn() 함수에서 설정하고 처리된 결과를 onserceOn() 함수에 설정된 스레드로 보내 최종 처리합니다.


RxJava에서 제공하는 스레드 외에 RxAndroid에서 제공하는 스케줄러

 스케줄러 이름

  설명

 AndroidSchedulers.mainThread() 

 안드로이드의 UI 스레드에서 동작하는 스케줄러입니다. 

 HandlerScheduler.from(handler) 

 특정 핸들러에 의존하여 동작하는 스케줄러 입니다. 



댓글