본문으로 바로가기
반응형

RxKotlin에서는 코틀린의 use 함수처럼 사용완료후 자원을 반환을 지원하는 연산자로 using을 지원합니다.

자바로 따지자면 try catch with resources와 같겠네요.

usetry catch with resourcesClosable interface를 구현한 클래스에 대해서 자동으로 close()를 호출해 주는 역할을 하지만 rxKotlin에서 제공하는 using은 그보다 범용적으로 resource를 해제할수 있는 위치를 제공합니다.


using operator

using은 세개의 람다를 param으로 전달받습니다.
1. resource의 선언
2. resource의 사용 및 Obserbable을 return
3. reousrce의 해제

class DataLoad {
    val list = mutableListOf()

    init {
        (1..10).forEach { list.add(it) }
    }

    fun release() {
        list.clear()
        println("release source")
    }
}

fun main(args: Array<String>) {
    Observable.using({
        DataLoad()
    }, { data ->
        data.list.toObservable()
    }, { data ->
        data.release()
    }).subscribeBy(onNext = { println(it) },
        onComplete = { println("completed!!") }
    , onError = {println(it)})
}

using의 첫번째 param으로 사용할 resource를 선언합니다.


여기서는 내부에 1~10까지의 값을 갖는 list를 멤버변수로 가진 DataLoad 클래스를 선언하고 첫번째 parameter에서 class를 생성했습니다.

using의 두번째 param에서는 인자로 넘겨받은 dataload 객체에서 list를 받아 observable로 생성합니다.

그리고 마지막 param에서도 넘겨받은 dataload 객체를 이용하여 class 내부에 선언해둔 release 함수를 호출합니다.

결과는 아래와 같습니다.


1

2

3

4

5

6

7

8

9

10

release source

completed!!

using의 세번째 param 부분이 onComplete() 직전에 호출되는걸 확인할 수 있습니다.


이번에는 같은형태에 error를 발생시키는 구문을 포함시켜 보겠습니다.


un main(args: Array<String>) {
    Observable.using({
        DataLoad()
    }, { data ->
        data.list.toObservable()
    }, { data ->
        data.release()
    }).map{
        if (it == 5) {
            throw Exception("Wow!! exception")
        } else {
            it
        }
    }.subscribeBy(onNext = { println(it) },
        onComplete = { println("completed!!") }
    , onError = {println(it)})
}

마지막 10번째 데이터를 방출시 exception을 throw 합니다.

결과는 아래와 같습니다.

1

2

3

4

release source

java.lang.Exception: Wow!! exception

throw가 발생하더라도 resource가 먼저 해제된후 error이 Observer로 전달됩니다.


반응형