Android 공부/Coroutine

[XX캠퍼스] 15.Kotlin Coroutines & Flow ( 완료 처리하기 )

Machine_웅 2022. 7. 27. 14:22
728x90
반응형

https://dalinaum.github.io/coroutines-example/15

 

플로우 완료처리하기

플로우 완료처리하기 예제 75: 명령형 finally 블록 완료를 처리하는 방법 중의 하나는 명령형의 방식으로 finally 블록을 이용하는 것입니다. import kotlinx.coroutines.* import kotlinx.coroutines.flow.* fun simple()

dalinaum.github.io

finally

onCompletion  - 문제 발생여부를 알수 있다. 

 

명령형 finally 블록

완료를 처리하는 방법 중의 하나는 명령형의 방식으로 finally 블록을 이용하는 것입니다.

 

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

fun simple(): Flow<Int> = (1..3).asFlow()

fun main() = runBlocking<Unit> {
    try {
        simple().collect { value -> println(value) }
    } finally {
        println("Done")
    }
}

실행결과 
1
2
3
Done

예외가 발생하던 , 성공하던  finally를 탄다. 

 

 

 

선언적으로 완료 처리하기

onCompletion 연산자를 선언해서 완료를 처리할 수 있습니다.

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

fun simple(): Flow<Int> = (1..3).asFlow()

fun main() = runBlocking<Unit> {
    simple()
    	.map{
            if(it > 2){
                throw IllegalStateException()
            }
            it
        }
        .catch{ e -> emit(-99)}
        .onCompletion { println("Done") }
        .collect { value -> println(value) }
}

실행결과
1
2
-99
Done

 

onCompletion의 장점

onCompletion은 종료 처리를 할 때 예외가 발생되었는지 여부를 알 수 있습니다.

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

fun simple(): Flow<Int> = flow {
    emit(1)
    throw RuntimeException()
}

fun main() = runBlocking<Unit> {
    simple()
        .onCompletion { cause -> if (cause != null) println("Flow completed exceptionally") }
        .catch { cause -> println("Caught exception") }
        .collect { value -> println(value) }
}

실행결과 
1
Flow completed exceptionally
Caught exception

 

 

 

728x90
반응형