본문 바로가기

IT/Kotlin7

Coroutine Async 코루틴에서 기본인 것 같지만 놓치는 부분이 있을 수도 있기에 정리해보려고 한다. Async async는 자주 사용해왔던 launch와 거의 흡사하다. 그러나 차이점이라면 launch는 job을 반환하는데에 비해 async는 Deferred라는 값을 반환한다. (아래 참조) fun CoroutineScope.async( context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart = CoroutineStart.DEFAULT, block: suspend CoroutineScope.() -> T ): Deferred (source) 그렇다면 Deferred가 무엇이길래 조금 다른 것일까? 엄밀히 말하면 Deferred도 job의 종류 중 하.. 2020. 11. 22.
Coroutine Job과 Scope Job Job은 life-cycle이 있는 cancellable 값?? 인터페이스 이다. 즉, 코루틴 context에 존재하는 여러 값 중 하나로 외부에 의해 언제든 중단이 가능한 값이다. (join 이나 cancel을 통해서..) Job을 구현하는 인터페이스는 2개 정도로 볼 수 있는데, Coroutine job과 CompletableJob이 있다. 1) Coroutine job은 launch 코루틴 빌더에 의해서 생성 2) CompletableJob은 Job() factory에 의해서 생성된다. 그런데 Job 특성이 코루틴 block을 실행시지만 결과값을 주진 않는다. (값을 얻기 위해서는 Deferred를..) Job의 내부 상태는 위의 그림과 같다. 코루틴의 시점마다 상태가 다를 수 있지만, 간단.. 2020. 11. 22.
Coroutine Context and Dispatchers 여타 자원들 처럼 코루틴 또한 내부적으로 Context를 가지고 있다. 이를 코루틴 Context라 명명하는데, 실제 관련 문서를 살펴보면, kotlinlang.org/api/latest/jvm/stdlib/kotlin.coroutines/-coroutine-context/ CoroutineContext - Kotlin Programming Language kotlinlang.org 인덱싱된 Element 인스턴스의 집합으로 Persistent 속성을 가지고 있다. 내부적으로 코루틴 dispatcher를 가지고 있는데, 이후에도 계속 살펴보겠지만 dispatcher는 코루틴이 어떤 스레드에서 실행될지 결정해주는 필수 요소이다. Dispatcher 간단하게 코루틴을 사용하게 되면 dispatcher에 신경.. 2020. 11. 22.
Coroutine Flow - 4부 Flow에 대해 4부로 계속 알아가보자. Launching Flow fun events(): Flow = (1..3).asFlow().onEach { delay(100) } fun main() = runBlocking { events() .onEach { event -> println("Event: $event") } .collect() // println("Event: $event") } .launchIn(this) // updateUi(value) } .onCompletion { cause -> updateUi(if (cause == null) "Done" else "Failed") } .catch { cause -> LOG.error("Exception: $cause") } .launchIn(uiS.. 2020. 11. 22.