본문 바로가기

Android/Coroutine18

[Android] runBlocking을 왜 주의해서 써야할까? (feat. Deadlock) 시작하기전에 Kotlin은 Android 개발에서 널리 사용되며, 비동기 및 논블로킹 프로그래밍을 지원하는 코루틴 기능을 제공합니다. 코루틴은 launch, async, runBlocking 같은 빌더로 시작할 수 있습니다. 이 중 runBlocking은 실행되는 스레드를 차단하기 때문에 Android의 메인 스레드에서 사용하면 UI 멈춤이나 ANR(Application Not Responding) 오류를 유발할 수 있습니다. 이 글에서는 runBlocking의 내부 메커니즘과 Android 개발 시 주의해야 할 사례들을 살펴보겠습니다.   runBlocking을 살펴보자runBlocking으로 작성하고, 10초의 delay를 걸어주었습니다. 이 코드는 Android UI에서 호출된 코드입니다.clas.. 2025. 2. 3.
[Android] Coroutine 왜 스레드보다 가볍다고 할까? 코루틴은 왜 스레드 보다 가볍다고 할까?코루틴 하나가 새로 생성되어 실행된다는 것이 그와 동시에 새로운 스레드 또한 생성되는 것을 의미하는 것은 아닙니다. (정확히 말하자면 이것은 코루틴 생성 시 스케쥴러 설정에 따라 다릅니다.) 사실, 코루틴은 스케쥴링 가능한 코드 블록 혹은 이러한 코드 블록들의 집합이라고 볼 수 있습니다. 이해를 돕기 위해서 코루틴이 실행되는 과정을 다음과 같이 그림으로 나타내 보았습니다. 제일 왼쪽에 보면 CoroutineScope 가있습니다. 우리가 어떤 코루틴을 실행하기 위해서는 어떤 코루틴 스코프에 속해 있어야 합니다.현재 코루틴 스코프가 갖는 컨텍스트(CoroutineContext) 에서 Dispatcher 는 UI Dispatcher 라고 되어 있습니다. 이것은 현재 스코.. 2025. 1. 31.
[Android] Coroutine Dispatcher에 대한 고찰 - Deep Dive 우리는 Kotlin의 흐름과 몇 가지 기본 개념의 내부 작동을 탐구했지만, 코루틴 디스패처에 대해서는 깊이 파고든 적이 없습니다. 이번 포스팅을 통해 Coroutine DisPatcher에 대해 깊게 알아보는 시간을 갖고자 합니다.이를 분석해서 이것이 코드에 어떤 영향을 미치는지 살펴보겠습니다. Dispatcher란?Dispatcher의 사전적인 의미는 사람이나 차량을 필요한 곳으로 보내는 일을 담당하는 사람입니다.Kotlin 코루틴에서의 Dispatcher는 Coroutine들을 적절하게 쓰레드 또는 쓰레드 풀에 할당하여 실행시키는 Scheduler 역할을 하는 코루틴 Cntext의 일부라고 할 수 있습니다. Dispactcher의 종류로는 Default / IO / Main / Unconfinied가.. 2025. 1. 27.
[Android] 코루틴(Coroutine) 내부적으로 어떻게 동작할까? 코루틴을 사용해보면 약간 궁금한 게 있었다. 어떻게 함수가 중단되고 재개되고 가능한지 의문이 생긴다. 그래서 한번 코루틴 내부를 한번 파헤쳐 보도록 하자.  아래 포스팅한 내용은 KotlinConf 2017 - Deep Dive into Coroutines on JVM by Roman Elizarov 영상의 내용들이다. 결론적으로 말하면, 코루틴은 디컴파일되면 일반 코드일 뿐이다. Continuation Passing Style(CPS, 연속 전달 방식) 이라는 형태의 코드로 전환한다.  아래에서 자세히 알아보자. Continuation Passing Style(CPS)코루틴은 컴파일러에서 CPS 로 변환이 된다. CPS 는 일종의 연속된 콜백의 형태라고 한다. 그래서 어떻게 동작하는지 알아보자. su.. 2025. 1. 24.
[Android] 콜백을 코루틴(Coroutine)으로 바꿔보자(SuspendCoroutine/SuspendCancellableCoroutine) 필자는 서버나, 외부 DB가 필요한 Android 프로젝트에 Firebase를 사용하고 있다. Firebase sdk의 경우 Java 코드로 구현되어 있으며, callback을 통해 비동기를 지원하는 것이 특징이다.필자는 이러한 callback을 SuspendCoroutines를 통해 처리하고 있으며, 해당 SuspendCoroutines에 대해 공부한 내용을 포스팅하려고 한다.  SuspendCoroutinesuspendCoroutine은 현재 코루틴을 일시 중단(suspend) 시키고, 현재의 실행 상태(Continuation) 를 외부로 전달하여 직접 재개(resume)하거나 예외 처리할 수 있게 해주는 함수입니다. 다른 suspend함수와 다른 특징은 개발자가, Continuation을 통해 코루.. 2024. 11. 16.
[Android] 코루틴(Coroutine)에서의 작업 취소 코루틴 에서의 작업 취소코루틴의 완벽한 제어를 위해서는 작업을 기다리고, 완료된 작업의 결과를 반환 받아서 처리하는것 뿐만아니라 작업의 취소 까지도 처리할수 있어야 합니다.제어에 사용 되는 Job 클래스 와 Deferred 클래스 에는 코루틴 블록의 작업을 취소하기 위한 cancel() 함수가 존재합니다.다음은 500 밀리초 간격으로 특정 문자열을 1000회 출력하는 코루틴 블록입니다. 이 블록을 시작한 이후 1300 밀리초가 지나면 코루틴을 취소합니다.fun cancellingCoroutineExecution() = runBlocking { val job = launch { repeat(1000) { i -> println("job: I'm sleeping $i ... 2024. 11. 15.