728x90
withTimeout()
코루틴에는 Timeout 동작을 간단히 처리할 수 있도록 withTimeout() 함수가 kotilnx.couroutines 패키지에 포함되어 있다.
withTimeout(a, b)
a : 작업을 수행할 시간 (millisecond)
b : 수행할 블록 함수
fun main() = runBlocking {
withTimeout(3000) {
repeat(1000) { i ->
println("job : $i")
delay(500)
}
}
}
실행결과:
job : 0
job : 1
job : 2
job : 3
job : 4
job : 5
TimeoutCancellationException : Timed out waiting for 3000 ms
위 코드를 실행시키면 3초간 실행되다가 작업을 취소하는 순간 TimeoutCancellationException이 발생하게 된다. 작업 취소보단 강제 중지라고 보는게 맞다.
이 경우 try-catch를 이용해 TimeoutCancellationException을 처리할 수 있다.
fun main() = runBlocking {
try {
withTimeout(3000) {
repeat(1000) { i ->
println("job : $i")
delay(500)
}
}
}catch (e: Exception){
println("job : $e")
}
}
실행결과:
job : 0
job : 1
job : 2
job : 3
job : 4
job : 5
job : kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 3000 ms
하지만 try-catch를 이용해도 결국 Exception은 발생하는 것을 볼 수 있다. 그럼 코틀린에서 제공하는 withTimeoutOrNull() 함수를 사용하는 방법도 있다.
withTimeoutOrNull()
withTimeoutOrNull() 함수도 kotlinx.coroutines 패키지에 포함되어 제공된다.
fun main() = runBlocking {
val job = withTimeoutOrNull(3000) {
repeat(10) { i ->
println("job : $i")
delay(500)
}
"Done"
}
println("Job is $job")
}
위의 코드가 시간 내에 정상 종료를 하게되면 "Done"을 반환받을 수 있다. 만약 시간 내 정상 처리되지 못하면 TimeoutCancellationException 대신 null을 반환받게 된다.
'Coroutine' 카테고리의 다른 글
Coroutines - Part. 5 안드로이드에서의 코루틴 - 동기식과 비동기식, 콜백과 코루틴 (0) | 2021.01.30 |
---|---|
Coroutines - Part. 4 안드로이드에서 코루틴 - ViewModel, Activity, Fragment (0) | 2021.01.30 |
Coroutines - Part. 2 취소, 취소할 수 없는 블럭 (0) | 2021.01.30 |
Coroutines - Part 1. 완료 대기, 지연 실행 (0) | 2021.01.30 |
Coroutines - Part 1. Coroutine이란 (0) | 2021.01.30 |