본문 바로가기
2023년 이전/ReativeX

RxJava, RxKotlin - RxAndroid 란?

by JeongUPark 2020. 2. 10.
반응형

[출처 - RxJava 프로그래밍 : 리액티브 프로그래밍 기초부터 안드로이드 까지 한번에]

본 글은 'RxJava 프로그래밍 : 리액티브 프로그래밍 기초부터 안드로이드 까지 한번에' 를 학습하면서 정리한 글입니다

 

RxAndroid란? 지금까지 공부한 ReactiveX 관련 기능을 Android App에서 쉽고 간견하게 사용할 수 있는 라이브러리를 말합니다.

 

그럼 왜 RxAndroid를 사용해야 할까요?

 

지금까지 Android 개발에서 제일 큰 어려움은 아마 thread 사용에 있을 것입니다.

1. 안ㄴ드로이드 비동기 처리 및 에러 핸들링.

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

3. 2개의 비동기 처리 후 결과 합성

4. 이벤트 중복 실행 

 

등 이외에도 다양한 어려움이 있었을 것입니다.

하지만 RxAndroid 사용함으로서 다음과 같은 장점을 얻을 수 있습니다.

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

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

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

 

이런 RxAndroid의 API는 여기서 확인 하실 수 있습니다.

간단하게

RxLifecycle은 RxJava를 사용하는 안드로이드 앱용 라이프 사이클 처리 API

RxBinding은 안드로이드 UI 위젯용 RxJava 바인딩 API

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

이 외에도 다양한 api가 존재하니 꼭 API를 확인하면 좋을것 같습니다.

 

그럼 Android Studio에서 어떻게 RxAndroid를 사용하는지 확인해 보겠습니다.

 

프로젝트를 생성 후 build.gradle에 다음을 추가합니다.(Project gradle이 아닌 Moudle:app gradle에 추가합니다.)

//RxAndroid와 RxJava , RxKotlin 추가
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
    implementation 'io.reactivex.rxjava2:rxjava:2.2.17'
    implementation 'io.reactivex.rxjava2:rxkotlin:2.4.0'
    
 // 필요한 API를 찾아서 추가 합니다.
 
    implementation 'com.jakewharton.rxbinding3:rxbinding:3.1.0'
    implementation 'com.uniquext.android:rxlifecycle:2.0.0'

 그리고 activity_main.xml을

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/main_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

하고

 

MainActivity.kt를

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import io.reactivex.Observable
import io.reactivex.observers.DisposableObserver
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val source = Observable.create<String> { it->
            it.onNext("Hello RxAndroid World")
            it.onComplete()
        }
        source.subscribe(observer)
    }

    var observer = object:DisposableObserver<String>(){
        override fun onComplete() {
            Log.d("TEST","observer onComplete")
        }

        override fun onNext(t: String) {
            main_text.text = t
        }

        override fun onError(e: Throwable) {
        }
    }
}

 이렇게 작성하면 다음과 같은 결과를 볼 수 있습니다.

 

 

위와 다르게

       val source = Observable.just("Hello RxAndroid world")
        source.subscribe(observer)

이렇게 해도 동일한 결과를 볼 수 있지만, 단 observer의 onNext만 동작하고 onComplete는 동작하지 않습니다.

반응형