From
연산자는 다양한 데이터 소스를 옵저버블(Observable)로 변환하는 역할을 합니다
배열, 리스트 등의 자료구조나 Future
, Callable
, Publisher
등은 from으로 시작하는 연산자를 통해 간단히 Observable로 변환할 수 있다.
-Future
는 Java
에서는 비동기적인 연산의 결과를 표현하는 인터페이스이며 비동기 작업은 작업이 완료될 때까지 대기하거나 작업의 상태를 확인할 수 있습니다. RxJava
에서는 fromFuture
연산자를 이용해 비동기 작업의 결과를 옵저버블로 변환하고 처리 할 수 있어요
-Callable
는 Java
에서 Runnable
과 비슷한 인터페이스 이며 비동기적으로 실행할 수 있는 작업을 나타내는 인터페이스이다. Runnable
과 다르게 특정 타입의 객체를 리턴합니다. Exception을 발생시킬 수도 있다. RxJava
에서는 fromCallable
연산자를 사용하여 비동기 작업을 실행하고 그 결과를 옵저버블로 변환할 수 있습니다.
-Publisher
는 Reactive Streams
에서 제공하는 인터페이스이며 데이터를 생성하고 내보낸다.
이 인터페이스를 사용시 subscriba()
함수를 구현해야 한다.Rxjava
에서는Publisher
를 사용하여 Reactive Streams
를 구현할 수도 있고 옵저버블로 변환할 수도 있습니다.
val numbers = arrayOf(1, 2, 3, 4, 5)
val observable = Observable.fromArray(*numbers)
observable.subscribe { numbers -> println(numbers) }
.let { _ -> }
Observable.fromArray
를 사용해 numbers 배열을 옵저버블로 변환합니다subscribe
함수를 호출하여 옵저버블을 구독
합니다. 람다로 열어서 출력을 하였습니다.구독
: 옵저버가 옵저버블에 등록되어, 옵저버블에서 발행되는 항목을 받아 처리할 수 있도록 하는 과정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 배열을 옵저버블로 변환합니다. 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
만약 데이터를 하나씩 발행해 보여주고 싶다면 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
는 가변 인자를 허용하지 않으며 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