Android 공부/Coroutine

코루틴 기초 정리 _ part 02 Cancellation And Timeouts

Machine_웅 2022. 7. 16. 18:24
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

 

Cancellation and timeouts | Kotlin

 

kotlinlang.org

 

 

 

728x90
반응형