기존에 다른 코루틴에 보내진 작업의 결과를 수신하려면 다음과 같이 코드를 만들어야 했다 suspend fun main() { val deferred: Deferred = CoroutineScope(Dispatchers.IO).async { "Async Result" } val result = deferred.await() println(result) } Deferred로 결과값을 감싼 다음 await() 메서드를 통해 해당 값이 수신될 때까지 기다려야 한다. withContext를 이용한 비동기 작업 순차화 withContext를 이용하면 withContext의 두가지 특성 때문에 이러한 작업을 간단하게 만들 수 있다. withContext 블록의 마지막 줄의 값이 반환 값이 된다. withContext..
Coroutines/Coroutine Basics
사실상 안드로이드 개발을 하면서는 Thread 혹은 Thread Pool을 만들 일이 거의 없다. 이미 만들어진 Dispatcher을 사용하는 것만으로 충분하기 때문이다. 하지만, 종종 커스텀 디스패처를 만들어야 할 필요하가 있다. 이에 부록으로 이 글을 쓰게 되었다. 커스텀 디스패처를 만드는 두가지 방법 코루틴에서는 아래 두가지 메서드로 커스텀 디스패처를 만들 수 있다. newSingleThreadContext(name: String) : Single Thread를 만드는 메서드 newFixedThreadPoolContext(nThreads: Int, name: String) : Thread Pool을 만드는 메서드 newSingleThreadContext로 단일 스레드를 사용하는 커스텀 디스패처 만들..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmsjU5%2FbtrcOeyZOJJ%2FOnoHwVVOMyKVOPZSKEBzK0%2Fimg.png)
Deferred란 Deferred는 직역하면 연기라는 뜻을 가진다. "결과값 수신을 연기한다"라는 뜻인데, 이는 미래의 어느 시점에 결과값이 올 것을 뜻한다. Deferred의 의미와 같이 "Deferred는 결과값을 수신하는 비동기 작업" 이라고 정의될 수 있다. Deferred는 Job이다. public interface Deferred : Job { public suspend fun await(): T public val onAwait: SelectClause1 .. } Deferred는 결과가 있는 비동기 작업을 수행하기 위해 결과 값이 없는 Job을 확장하는 인터페이스이다. 즉, Deferred는 Job이며, 이로 인해 Deferred는 Job의 모든 특성을 갖는다. 8번 글이었던 Job의 상태..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTkXIM%2FbtrmlW2SEok%2F8OT9mwhmB3qc3UbXBVcJ4k%2Fimg.png)
이번 글에서는 Job의 Exception을 Handling하는 방법을 살펴볼 것이다. Exception을 Handling하는 방법은 invokeOnCompletion을 이용한 방법과 CoroutineExceptionHandler 을 이용하는 방법 이 있다. 먼저 invokeOnCompletion을 사용하는 방법을 살펴보자. invokeOnCompletion을 이용한 Exception Handling 앞서 7번 글에서 다웠던 invokeOnCompletion을 코루틴 내부에서 애러가 발생했을 때도 사용할 수 있다. 아래와 같이 invokeOnCompletion을 사용해 Exception을 Handling할 수 있다. fun main() = runBlocking { val job = launch(Dispat..
![](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flo6k2%2FbtrcHfsBY18%2F7GZyCKAPzy2uT7ELFpRIZK%2Fimg.png)
Job의 상태 변수 : isActive, isCancelled, isCompleted Job의 상태 변수는 세가지가 있는데 의 방식으로 접근이 가능하다. 이 상태 변수들은 다음과 같이 설명될 수 있다. isActive: Job이 실행중인지 여부를 표시 isCancelled: Job cancel이 요청되었는지 여부를 표시 isCompleted: Job의 실행이 완료되었거나 cancel이 완료었는지를 표시 자세한 상태변화를 아래 예시와 함께 알아보자. Job이 CoroutineStart.LAZY 옵션으로 생성되었을 때 상태 변화 Job을 생성됨에서 실행중 상태로 자동으로 넘기지 않기 위해 CoroutineStart.LAZY 옵션을 이용해 Job의 상태변수를 다루어보자. isActive isCancelled ..