Vintage appMaker의 Tech Blog

[kotlin] Coroutine 취소방법 - Job을 이용한 2가지 본문

Source code or Tip/Android(Java, Kotlin)

[kotlin] Coroutine 취소방법 - Job을 이용한 2가지

VintageappMaker 2021. 5. 17. 18:09

Coroutine을 취소하려면 Job의 cancel()를 사용한다. 

Job을 사용하는 방법은 크게 2가지이다. 

 

  • CoroutineScope의 lauch를 실행 후, 결과값으로 Job을 받는방법
  • Job을 생성한 후,  CoroutineScope의 lauch의 파라메터로 넘기는 방법(주로 + 를 이용하여 CoroutineDispatcher와 같이 넘김)


import kotlinx.coroutines.*
import java.util.concurrent.TimeUnit

fun main(args: Array<String>) = runBlocking {

    // job을 넘겨서 취소
    val job = Job()
    JobTest1(job)

    delay(1000 * 5)
    job.cancel()
    println("job.cancel()")

    // job을 넘겨받아 취소
    val job2 = JobTest2()

    delay(1000 * 5)
    job2.cancel()
    println("job2.cancel()")

    // 실행결과 보기위해 대기
    delay(1000 * 100)
}


private suspend fun JobTest2() : Job{
    val job2 = CoroutineScope(Dispatchers.Default).launch {
        val totalSeconds = TimeUnit.MINUTES.toSeconds(2)
        val tickSeconds = 1
        for (second in totalSeconds downTo tickSeconds) {
            val time = String.format(
                "%02d분%02d초",
                TimeUnit.SECONDS.toMinutes(second),
                second - TimeUnit.MINUTES.toSeconds(TimeUnit.SECONDS.toMinutes(second))
            )
            println(time)
            delay(1000)
        }
        println("끝")
    }

    return job2
}

// job을 넘겨서 취소
private suspend fun JobTest1(job: CompletableJob) {
    CoroutineScope(Dispatchers.Default + job).launch {
        val totalSeconds = TimeUnit.MINUTES.toSeconds(2)
        val tickSeconds = 1
        for (second in totalSeconds downTo tickSeconds) {
            val time = String.format(
                "%02d분%02d초",
                TimeUnit.SECONDS.toMinutes(second),
                second - TimeUnit.MINUTES.toSeconds(TimeUnit.SECONDS.toMinutes(second))
            )
            println(time)
            delay(1000)
        }
        println("끝")
    }
}

여담으로 IntelliJ에서는 비동기 함수들을 물결표시 화살표 아이콘으로 표시해준다. 

 

Comments