<RxJava>From

진섭·2023년 5월 25일
0

RxJava

목록 보기
3/20
post-thumbnail

📌 From 연산자란?

From 연산자는 다양한 데이터 소스를 옵저버블(Observable)로 변환하는 역할을 합니다
배열, 리스트 등의 자료구조나 Future, Callable, Publisher 등은 from으로 시작하는 연산자를 통해 간단히 Observable로 변환할 수 있다.

-FutureJava에서는 비동기적인 연산의 결과를 표현하는 인터페이스이며 비동기 작업은 작업이 완료될 때까지 대기하거나 작업의 상태를 확인할 수 있습니다. RxJava에서는 fromFuture 연산자를 이용해 비동기 작업의 결과를 옵저버블로 변환하고 처리 할 수 있어요

-CallableJava에서 Runnable과 비슷한 인터페이스 이며 비동기적으로 실행할 수 있는 작업을 나타내는 인터페이스이다. Runnable과 다르게 특정 타입의 객체를 리턴합니다. Exception을 발생시킬 수도 있다. RxJava에서는 fromCallable 연산자를 사용하여 비동기 작업을 실행하고 그 결과를 옵저버블로 변환할 수 있습니다.

-PublisherReactive Streams에서 제공하는 인터페이스이며 데이터를 생성하고 내보낸다. 이 인터페이스를 사용시 subscriba() 함수를 구현해야 한다.Rxjava에서는Publisher를 사용하여 Reactive Streams를 구현할 수도 있고 옵저버블로 변환할 수도 있습니다.

📌 From 연산자 사용법

1

  val numbers = arrayOf(1, 2, 3, 4, 5)
    val observable = Observable.fromArray(*numbers)
    observable.subscribe { numbers -> println(numbers) }
        .let { _ -> }
  • numbers라는 배열을 생성 후 그 안에 1,2,3,4,5를 넣어 줬어요
  • Observable.fromArray를 사용해 numbers 배열을 옵저버블로 변환합니다
  • subscribe 함수를 호출하여 옵저버블을 구독합니다. 람다로 열어서 출력을 하였습니다.
  • 구독: 옵저버가 옵저버블에 등록되어, 옵저버블에서 발행되는 항목을 받아 처리할 수 있도록 하는 과정
  • 경고 메시지를 없애기 위해 .let { _ -> }를 사용해 사용 함수 의 결과를 임시로 처리했습니다.

2

val arrayNum = arrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
val arrayNum2 = arrayOf(10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120)
fun main() {
    val observable = Observable.fromArray(arrayNum,arrayNum2)

    val observer = object : Observer<Array<Int>> {
        override fun onSubscribe(d: Disposable) {
            println("fromOperator :onSubscribe")
        }

        override fun onError(e: Throwable) {
            println("fromOperator :onError ${e.toString()}")
        }

        override fun onComplete() {
            println("fromOperator :onComplete")
        }

        override fun onNext(t: Array<Int>) {
            println("fromOperator :onNext : ${t.contentToString()}")
        }
    }
    observable.subscribe(observer)
}
  • arrayNum,arrayNum2의 Int 배열을 생성했습니다.
  • Observable.fromArray 함수를 사용하여 arrayNum과 arrayNum2 배열을 옵저버블로 변환합니다.
  • Observer 인터페이스를 구현하는 익명 클래스를 생성하여 observer 변수에 할당합니다.
  • Implement members에는 onSubscribe,onError,onComplete,onNext가 들어있습니다. 순서대로 옵저버가 옵저버블을 구독한 후 호출, 오류가 발생했을 때 호출, 옵저버블의 발행이 완료되었을 때 호출, 옵저버블로부터 항목이 발행될 때마다 호출하는 함수들입니다.
  • observable.subscribe(observer) 에서 옵저버블에게 구독을 설정하여 옵저버를 등록하고 옵저버블은 등록된 옵저버에게 항목을 발행합니다.
출력결과
fromOperator :onSubscribe
fromOperator :onNext : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
fromOperator :onNext : [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]
fromOperator :onComplete

3

만약 데이터를 하나씩 발행해 보여주고 싶다면 fromIterable를 사용하는 게 좋습니다.

    val mlistNum = mutableListOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
    val observable =Observable.fromIterable(mlistNum)

    val observer = object:Observer<Int>{
        override fun onSubscribe(d: Disposable) {
            println("fromOperator :onSubscribe")
        }

        override fun onError(e: Throwable) {
            println("fromOperator :onError ${e.toString()}")
        }

        override fun onComplete() {
            println("fromOperator :onComplete")
        }

        override fun onNext(t: Int) {
            println("fromOperator :onNext : $t")
        }
    }

    observable.subscribe(observer)
실행결과
fromOperator :onSubscribe
fromOperator :onNext : 1
fromOperator :onNext : 2
fromOperator :onNext : 3
fromOperator :onNext : 4
fromOperator :onNext : 5
fromOperator :onNext : 6
fromOperator :onNext : 7
fromOperator :onNext : 8
fromOperator :onNext : 9
fromOperator :onNext : 10
fromOperator :onNext : 11
fromOperator :onNext : 12
fromOperator :onComplete
  • 이 코드는 이전 코드와 비슷하지만 다른 점은 옵저버블로 변환 할 때 fromIterable를 사용했습니다.

fromArray과 fromIterable의 차이점

  • fromArray는 가변 인자를 허용하며 , 배열이나 여러 개의 개별 인자를 사용하여 옵저버블을 생성할 수 있습니다.
    -fromIterable는 가변 인자를 허용하지 않으며 Iterable 객체를 사용하여 옵저버블을 생성합니다. 쉽게 말하면 요소에 대한 반복을 해준다.

참고 문서
1.https://reactivex.io/documentation/operators/from.html
2.https://blog.yena.io/studynote/2020/10/23/Android-RxJava(2).html
3.https://velog.io/@been/%EC%9E%90%EB%B0%94-%EC%9E%90%EB%B0%94%EC%9D%98-%EB%B9%84%EB%8F%99%EA%B8%B0-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D
4. https://jade314.tistory.com/entry/%EB%A6%AC%EC%97%91%ED%8B%B0%EB%B8%8CReactive-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EA%B8%B0%EB%B3%B8-%EA%B5%AC%EC%84%B1-%EC%9A%94%EC%86%8C

profile
Android 개발자

0개의 댓글