본문 바로가기

Coroutine

(12)
📌Coroutine(코루틴) 실습 : viewModelScope, launch, suspend, join 코루틴에 대한 내용을 공부하고 Android에서 사용해오다 깔끔하게 정리해보려 합니다. 1. 모듈 수준의 build.gradle 파일에 ViewModel KTX 라이브러리 종속성 추가 def lifecycle_version = "2.4.1" // ViewModel implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version" viewModelScope() 함수를 제공받기 위해서 ViewModel KTX 라이브러리를 추가합니다. 2. ViewModel 인스턴스 초기화 class MainActivity : AppCompatActivity() { private lateinit var mainViewModel: MainViewMode..
👋Coroutine : 1. Coroutine이란 fun routine() { subRoutine() } fun subRoutine() { .... } Routine은 컴퓨터 프로그램의 일부이며 특정한 일을 실행하기 위한 일련의 명령입니다. 이러한 일련의 명령을 함수라고 합니다. Sub Routine은 함수 내부에 함수가 존재하는 경우 내부에 존재하는 함수를 의미합니다. 즉 sub routine은 routine에 의해 순차적으로 수행되게 됩니다. Coroutine이란 코루틴은 무엇일까? 위에서 확인했던 Routine과 Sub Routine은 순차적으로 수행되었지만 Coroutine은 함께 수행됩니다. 스레드는 선점형 멀티태스킹으로 실제로 멀티코어를 사용해 *병렬성을 가질 수 있지만 코루틴은 비선점형 멀티태스킹으로 CPU를 시간분할하여 사용하기 때문에 실..
Coroutines - Part. 9 Asynchronous Flow withContext Suspend Function이며, 내부 동작하는 스레드를 강제 지정할 수 있습니다. withContext의 잘못된 사용법에 대해 알아보겠습니다. import kotlinx.coroutines.* import kotlinx.coroutines.flow.* fun log(msg: String) = println("[${Thread.currentThread().name}] $msg") fun foo(): Flow = flow { log("Started foo flow") withContext(Dispatchers.IO){ for (i in 1..3) { emit(i) } } } fun main() = runBlocking { foo().collect { value -> log("Coll..
Coroutines - Part. 8 Asynchronous Flow Asynchronous Flow(비동기 흐름) 일시 중단 함수는 비동기적으로 단일 값을 반환하지만 계산된 여러 값을 반환 하려면 어떻게 해야할까요? Kotlin Flows를 사용하면 됩니다. Representing multiple values(여러 값 표시) collection을 사용해 Kotlin에서 여러 값을 나타내는 방법이 있습니다. 예를 들어, mCoroutine() 함수의 반환 값인 List에서 forEach를 사용해 모두 출력시키는 방법을 사용할 수 있습니다. fun mCoroutine(): List = listOf(1, 2, 3) fun main() { mCoroutine().forEach { value -> println(value) } } 실행결과: 1 2 3 Sequences CPU를 ..
Coroutines - Part. 7 Debugging Coroutine and Thread 코루틴은 한 스레드에 의해 중지되고 다른 스레드에서 다시 시작이 가능하다. Single Thread Dispatcher를 사용할 경우 코루틴이 언제, 어디서, 무엇을 수행하는지 파악하기가 쉽지 않다. Debugging using logging 각 로그문장에 스레드의 이름을 출력하는 것이 가장 일반적인 방법이지만, 코루틴을 사용할 때 스레드의 이름만으로는 context를 판단하기는 어렵기 때문에 kotlinx.coroutines에서 지원하는 디버깅을 사용하는 것이 좋다. 아래의 예제를 실행해보자 import kotlinx.coroutines.* fun log(msg: String) = println("[${Thread.currentThread().name}] $msg") fun main() = runBlo..
Coroutines - Part. 6 CoroutineContext 및 Dispatchers CoroutineContext 코루틴은 Kotlin 표준 라이브러리에 정의된 CoroutineContext 유형의 값으로, 코루틴을 어떻게 처리할 지에 대한 집합이고 유형의 값에 따른 Context에서 실행된다. CoroutineContext는 다양한 요소들의 집합이고 Job, Dispatchers를 가진다. ​ CoroutineContext Method ☞ get() : 연산자(operator) 함수로써 주어진 key 에 해당하는 컨텍스트 요소를 반환합니다. ☞ fold() : 초기값(initialValue)을 시작으로 제공된 병합 함수를 이용하여 대상 컨텍스트 요소들을 병합한 후 결과를 반환합니다. 예를들어 초기값을 0을 주고 특정 컨텍스트 요소들만 찾는 병합 함수(filter 역할)를 주면 찾은 개..
Coroutines - Part. 5 안드로이드에서의 코루틴 - 동기식과 비동기식, 콜백과 코루틴 동기식 코루틴 (synchronous : 순차적인 실행) 동기식의 코루틴을 실행할 필요가 있을 시 비동기식 코루틴 빌더에 코루틴의 start() 함수를 정의함으로써 동기식으로 사용이 가능하다. uiScope.launch(handler) { val job1 = async(Dispatchers.Default, CoroutineStart.LAZY) { //백그라운드 스레드에서 동작 Log.v("job 1", "작업 중!!") delay(3000) } val job2 = async(Dispatchers.Default, CoroutineStart.LAZY) { //백그라운드 스레드에서 동작 Log.v("job 2", "작업 중!!") delay(3000) } Log.v("job1, 2", "준비") //job1...
Coroutines - Part. 4 안드로이드에서 코루틴 - ViewModel, Activity, Fragment Android Acitivty 또는 Fragment는 자체 수명주기와 함께 제공된다. 앞서 말한 생명주기와 비동기 작업이 구조적 동시성(Structed concurrency)을 달성하기 위해선 GlobalScope와 함께 코루틴을 실행하는 것은 좋은 옵션이 아니다. 더 나은 접근 방식을 선정해야하는데 Android 구성 요소로 코루틴 범위를 제한하는 것이 하나의 방법이다. ​ Android 아키텍처 구성 요소를 사용하면 코루틴을 훨씬 더 쉽게 사용할 수 있다. ​ ViewModel에서의 코루틴 ☞ Job 객체 생성 ☞ Job 및 Dispatcher를 이용해 CoroutineScope를 생성 ☞ CoroutineScope에서 코루틴 빌더(launch, async)를 사용한다. ☞ onCleared를 오버라..