본문 바로가기

Kotlin/Coroutine8

(Coroutine) 7. Flow Basics 1. Data Stream 코루틴에서 Flow는 하나의 단일 값만 반환할 수 있는 suspend function과는 달리 여러 값을 순차적으로 내보낼 수 있는 즉, 데이터 스트림을 구현하기 위한 라이브러리이다. 예를 들어, 데이터베이스의 업데이트 내용들을 Flow를 통해 라이브하게 얻을 수 있다. 여기서 설명하는 데이터 스트림은 크게 3가지 항목으로 구성된다. Producer (생산자) Producer는 데이터 스트림에 추가되는 데이터를 생산하는 역할을 한다. Flow를 이용해 비동기적으로 데이터를 생성할 수 있다. Intermediary (중개자) 데이터 스트림을 통해 내보내는 각각의 값이나 스트림 자체를 수정하는 역할을 한다. Optional하기 때문에 반드시 필요한 것은 아니다. Consumer (.. 2022. 11. 2.
(Coroutine) 6. CoroutineExceptionHandler, SupervisorJob 1. CEH (Coroutine Exception Handler) GlobalScope와 CoroutineScope를 통해 runBlocking을 사용하지 않고도 별도의 Scope를 만들 수 있게 되었다. CoroutineScope와 함께 이번에 살펴볼 CEH를 이용하면 더욱 체계적으로 코루틴에서의 예외 처리를 할 수 있다. 아래 예시를 살펴보자. suspend fun printRandom1() { delay(1000L) println(Random.nextInt(0, 500)) } suspend fun printRandom2() { delay(500L) throw ArithmeticException() } val ceh = CoroutineExceptionHandler { _, throwable -> p.. 2022. 11. 2.
(Coroutine) 5. Scope 1. GlobalScope GlobalScope는 어디에도 속하지 않는 Scope이다. 이전 포스팅에서 살펴보았던 예제들에서 사용되던 Scope는 다른 코루틴에 의해 만들어지고 그에 따라 계층적인 성격을 가지고 있었다. 지금 살펴볼 GlobalScope는 원래부터 존재하는 전역적인 Scope이다. 따라서, 계층적으로 관리되지 않는다. suspend fun printRandom() { delay(500L) println(Random.nextInt(0, 500)) } @OptIn(DelicateCoroutinesApi::class) fun main() { val job = GlobalScope.launch(Dispatchers.IO) { launch { printRandom() } } Thread.sleep.. 2022. 11. 1.
(Coroutine) 4. CoroutineContext, Dispatcher 1. CoroutineContext 우리는 지금까지의 포스팅을 통해 코루틴은 항상 CoroutineContext 상에서 실행되는 것을 알고있다. 그렇다면 CoroutineContext는 어떻게 구현되어 있을까? // CoroutineContext.kt public interface CoroutineContext { public operator fun get(key: Key): E? public fun fold(initial: R, operation: (R, Element) -> R): R public operator fun plus(context: CoroutineContext): CoroutineContext = { ... } public fun minusKey(key: Key): CoroutineCo.. 2022. 9. 14.