Language/Reactive

RxAndroid

728x90
반응형

[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 프로그래밍

728x90
반응형