Coroutine

    [Coroutine] 11. Coroutine CoroutineContext를 다루는 방법 : Coroutine Dispatcher과 ExceptionHandler을 CoroutineContext를 이용해 관리하기

    CoroutineContext 앞서 우리는 다음의 내용들을 배웠다. Dispatcher: 코루틴이 실행될 스레드 풀을 잡고 있는 관리자 CoroutineExceptionHandler: 코루틴에서 Exception이 생겼을 때의 처리기 그런데 이 두 가지 요소는 CoroutineContext가 들어가야 할 자리에 그대로 들어갈 수 있다. 에서는 Dispatcher가 CoroutineContext 자리에 들어간다. 에서는 CoroutineExceptionHandler가 CoroutineContext자리에 들어간다. 이것이 가능한 이유는 각각이 CoroutineContext를 확장하는 인터페이스의 구현체이기 때문이다. *CoroutineDispatcher의 내부 살펴보기 더보기 public abstract c..

    [Coroutine 부록] 3. withContext 사용해 join, await 대체하기

    기존에 다른 코루틴에 보내진 작업의 결과를 수신하려면 다음과 같이 코드를 만들어야 했다 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..

    [Coroutine 부록] 2. 사용자 정의 ThreadPool을 사용하는 커스텀 디스패처 만들기

    사실상 안드로이드 개발을 하면서는 Thread 혹은 Thread Pool을 만들 일이 거의 없다. 이미 만들어진 Dispatcher을 사용하는 것만으로 충분하기 때문이다. 하지만, 종종 커스텀 디스패처를 만들어야 할 필요하가 있다. 이에 부록으로 이 글을 쓰게 되었다. 커스텀 디스패처를 만드는 두가지 방법 코루틴에서는 아래 두가지 메서드로 커스텀 디스패처를 만들 수 있다. newSingleThreadContext(name: String) : Single Thread를 만드는 메서드 newFixedThreadPoolContext(nThreads: Int, name: String) : Thread Pool을 만드는 메서드 newSingleThreadContext로 단일 스레드를 사용하는 커스텀 디스패처 만들..

    [Coroutine] 10. Deferred를 이용한 결과값 수신

    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의 상태..

    [Coroutine] 9. Coroutine Job에서 Exception이 발생했을 때 Exception Handling을 하는 방법

    이번 글에서는 Job의 Exception을 Handling하는 방법을 살펴볼 것이다. Exception을 Handling하는 방법은 invokeOnCompletion을 이용한 방법과 CoroutineExceptionHandler 을 이용하는 방법 이 있다. 먼저 invokeOnCompletion을 사용하는 방법을 살펴보자. invokeOnCompletion을 이용한 Exception Handling 앞서 7번 글에서 다웠던 invokeOnCompletion을 코루틴 내부에서 애러가 발생했을 때도 사용할 수 있다. 아래와 같이 invokeOnCompletion을 사용해 Exception을 Handling할 수 있다. fun main() = runBlocking { val job = launch(Dispat..