728x90
반응형
Cancellation ( 취소 , 해제 )
코루틴 취소
val job = launch {
repeat(1000) { i ->
println("job: I'm sleeping $i ...")
delay(500L)
}
}
delay(1300L) // delay a bit
println("main: I'm tired of waiting!")
job.cancel() // cancels the job
job.join() // waits for job's completion
println("main: Now I can quit.")
런치는 잡을 반환하는데, 거기서 cancel() 하면 취소가 됩니다.
코루틴에서 취소가능 여부 체크하기 (방법1 - suspend )
val job = launch(Dispatchers.Default) {
repeat(5) { i ->
try {
// print a message twice a second
println("job: I'm sleeping $i ...")
delay(500)
} catch (e: Exception) {
// log the exception
println(e)
}
}
}
delay(1300L) // delay a bit
println("main: I'm tired of waiting!")
job.cancelAndJoin() // cancels the job and waits for its completion
println("main: Now I can quit.")
조건
1. suspend function 이 있어야 한다. ( delay) , 또는 yield() 를 사용
2. 일시중단후 재개될때 예외가 발생한다는걸 잊지 말기.
코루틴에서 취소가능 여부 체크하기 (방법2 - 상태체크 isActive )
val startTime = System.currentTimeMillis()
val job = launch(Dispatchers.Default) {
var nextPrintTime = startTime
var i = 0
while (isActive) { // cancellable computation loop
// print a message twice a second
if (System.currentTimeMillis() >= nextPrintTime) {
println("job: I'm sleeping ${i++} ...")
nextPrintTime += 500L
}
}
}
delay(1300L) // delay a bit
println("main: I'm tired of waiting!")
job.cancelAndJoin() // cancels the job and waits for its completion
println("main: Now I can quit.")
- isActive 값에 따라 코루틴을 종료한다.
- suspend 함수가 필요없다.
- 예외가 발생하지 않는다.
코루틴이 실행되다가 멈췄을때 리소스를 해제 하는 위치 ( finally)
val job = launch {
try {
repeat(1000) { i ->
println("job: I'm sleeping $i ...")
delay(500L)
}
} finally {
println("job: I'm running finally")
// 여기서 리소스를 해제해주자.
}
}
delay(1300L) // delay a bit
println("main: I'm tired of waiting!")
job.cancelAndJoin() // cancels the job and waits for its completion
println("main: Now I can quit.")
Timeouts( 시간 만료 )
- 시간이 지나면 코루틴을 종료하겠다.
withTimeout(1300L) {
repeat(1000) { i ->
println("I'm sleeping $i ...")
delay(500L)
}
}
- 예외가 발생한다. ( 앱이 죽는다 )
Timeouts 예외가 발생했을때 null을 반환 ( 예외를 던지지 않는다. )
val result = withTimeoutOrNull(1300L) {
repeat(1000) { i ->
println("I'm sleeping $i ...")
delay(500L)
}
"Done" // will get cancelled before it produces this result
}
println("Result is $result")
https://kotlinlang.org/docs/cancellation-and-timeouts.html#asynchronous-timeout-and-resources
728x90
반응형
'Android 공부 > Coroutine' 카테고리의 다른 글
[XX캠퍼스] 02. Kotlin Coroutines & Flow ( 잡,구조화된동시성 ) (0) | 2022.07.20 |
---|---|
[XX캠퍼스] 01. Kotlin Coroutines & Flow ( 스코프빌더 ) (0) | 2022.07.19 |
코루틴 Flow 참고 블로그 주소 (0) | 2022.07.16 |
코루틴 기초 정리 _ part 01 (0) | 2022.07.14 |
(스크랩) 코루틴 이란? (0) | 2020.12.23 |