본문 바로가기

Coroutine

(12)
Coroutines - Part. 3 withTimeout(), withTimeoutOrNull() 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초간 실행..
Coroutines - Part. 2 취소, 취소할 수 없는 블럭 GlobalScope은 프로젝트의 전반적인 구간을 의미합니다. fun main() = runBlocking { GlobalScope.launch { repeat(10) { i -> println(" $i ...") delay(500) } } async { println("do1() : "+do1()) } println("...") delay(5000) } suspend fun do1(): Int { delay(1000) // 스레드 블록이 아닌 코루틴을 중단하는 suspending function이므로 코루틴에서만 사용 가능 return 13 } 실행결과: 0 ... ... 1 ... do1() : 13 2 ... 3 ... 4 ... 5 ... 6 ... 7 ... 8 ... 9 ... 위의 실행결과를..
Coroutines - Part 1. 완료 대기, 지연 실행 저번 시간에는 launch를 사용했었다. launch와 async launch와 async는 쓰레드처럼 코루틴을 시작하는 의미이며, 코루틴 빌더라는 것은 전 포스팅에서 확인했다. 즉 코루틴을 생성해주는 것인데, 둘의 차이점이 뭔가? launch는 Job 객체를 반환하지만 async는 Defferd 객체를 반환한다. Job은 launch로 생성된 코루틴의 상태를 관리하는 용도로 사용하고 결과값을 리턴받을 수 없으나, Deferred는 async블럭 내 수행된 결과를 원하는 시점에 return받을 수 있다는 큰 차이가 있습니다. 완료 대기 async 코루틴 블록을 실행하게 되면 Deferred 객체에 대해 await() 함수로 코루틴 블록이 완료될 때까지 대기할 수 있다. launch 코루틴 블록을 실행하게..
Coroutines - Part 1. Coroutine이란 Coroutine 코루틴은 기존에 비동기 처리 시의 Callback 구현, cancel 작업, Resource 관리 등을 해야하는 불편을 줄이고 비동기 처리를 간단하게 할 수 있도록 해주며, MainThread가 bockling 되는 상태를 관리할 수 있도록 도움을 준다고 한다. ​ 보통 네트워크를 call하고 ui를 업데이트 시키는 작업을 할 때 MainThread에서 비동기 처리가 허용되지 않아 Exception: NetworkOnMainThreadException 예외가 발생하고, 이 것을 위해 thread에 작업을 시키면, ui를 업데이트 시키는 작업은 Ui Thread에서 작업해야 하므로 또 Exception: CalledFromWrongThreadException 예외가 발생한다. 그래서 th..