Android Kotlin Coroutine

사용 언어: Kotlin 1.9.21
사용 버전: Kotlin Playground

안드로이드 코틀린 Coroutine을 알아보겠습니다.

Coroutine(코루틴)은 Kotlin의 자체 기능으로 asynchronous(비동기) 또는 non-blocking(논 블로킹) 프로그래밍을 위해 만들어졌습니다.

동기는 함수가 실행되고 완료되어야 다음 코드가 실행되는 일반적인 프로그래밍을 말하고,
비동기는 함수가 실행되고 완료되기 전에 다른 코드가 실행되는 것을 말합니다.

Coroutine은 suspend라는 키워드를 사용하는데요. 완료될 때까지 기다린다는 뜻입니다.
Coroutine을 실행하기 위해서는 CoroutineScope 안에서 동작을 해야 합니다.
그래서 Coroutine 밖에서 코루틴을 실행하기 위해서는 runBlocking을 사용합니다.

https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html





해당 문서를 보면, 새로운 coroutine을 만들고 현재 thread를 block 한다고 합니다.

코루틴 안에서 호출하면 안 됩니다.

보통은 main이나 test에서 사용됩니다.




coroutine을 사용하기 위해서는 kotlinx.coroutines.* 패키지가 필요합니다.

import kotlinx.coroutines.*






runBlocking 안은 CoroutineScope 안이지만 순서대로 실행합니다.



Coroutine은 Structured concurrency를 따르기 때문에 Coroutine 안에서만 또 다른 Coroutine을 만들 수 있습니다. 이러한 구조 덕분에 프로그램에서 관리가 가능합니다.


또 다른 Coroutine을 만드는 방법은 두 가지가 있습니다.

launch와 coroutineScope입니다.













launch는 block 하지 않고, coroutineScope는 block 합니다.

launch는 반환값이 Job이고, coroutineScope는 제네릭 R을 반환합니다.







위의 코드를 해석해 보면, runBlocking의 coroutineScope가 실행되는데, launch는 non-block이기 때문에 우선적으로 runBlocking이 실행되어 다음 코드가 진행되고, coroutineScope는 block을 하기 때문에 runBlocking을 멈추고 먼저 coroutineScope 안에 있는 println이 실행되어 먼저 출력됩니다.




결과가 나오기까지 기다리는 async도 있습니다. async는 await와 짝을 이룹니다.








async는 Deferred라는 타입을 반환하는데, 이것은 미래의 결괏값을 나타냅니다.









await는 blocking 없이 async의 결괏값을 기다립니다.







함수로 만들어서 사용하려면 suspend 키워드를 사용합니다.





취소도 가능합니다.

cancel()을 사용합니다.

자식들의 취소는 서로 영향을 주지 않습니다.








부모의 취소는 자식들에게 영향을 줍니다.






isActive로 취소 여부를 확인할 수 있습니다.







exception이 발생하면 상위 coroutine으로 전파되어 종료됩니다.







try, catch로 exception(예외)를 다룰 수 있습니다.







withContext는 기존의 corouineContext의 내용을 변경하여 coroutineContext를 만들 수 있습니다.







아래 코드는 Thread가 Main에서 DefaultDispatcher-worker로 변경됩니다.

Dispatchers.Main은 UI 용

Dispatchers.IO는 디스크 읽기 쓰기, 인터넷 읽기 쓰기 용

Dispatchers.Default는 CPU 작업 용







끝.


카테고리: Android

댓글

이 블로그의 인기 게시물

Python urllib.parse.quote()

Python bytes.fromhex()

Python OpenCV 빈 화면 만들기

Android Notification with Full Screen

Android Minimum touch target size

Android Compose Instrumentation test to unit test

KiCad 시작하기 7 (FreeRoute 사용하기 2)

tensorflow tf.expand_dims()

딩기 요트 명칭

Android AVD Ram size change