Kotlin Coroutine에 대해 공유하려 합니다.

코루틴에 대해 이야기하기 전에 비동기와 동기에 대해 이야기해야 합니다.

비동기식 vs 동기식

  • 비동기식 코드는 이전 코드가 완료될 때까지 기다리지 않고 실행할 수 있으며 동시에 여러 작업을 실행할 수 있습니다. 예를 들어, 실생활에서 비동기는 커피숍에서 커피를 기다리는 동안 커피를 주문하는 것과 같으며, 동료와 회의를 하거나 소셜 미디어를 스크롤하는 것과 같은 다른 일을 할 수 있습니다.
  • 동기식 코드는 이전 코드가 완료된 후 실행할 수 있습니다. 동기식을 사용하면 동시에 단일 작업만 실행할 수 있습니다. 예를 들어 실생활에서 동기는 계산원에서 줄을 서서 기다리는 것과 같으며 계산원 앞에서 서비스를 받은 후에 서비스를 받을 수 있습니다.

sync vs async

위의 예에서 동기식 고객은 제품이 완료된 후에 실행할 수 있고 주문은 고객이 완료된 후에 실행할 수 있지만 비동기식에서는 제품과 고객을 동시에 실행할 수 있으므로 비동기식으로 많은 시간을 절약할 수 있습니다!

그렇다면 코틀린 코루틴은 무엇일까요?

코루틴은 네트워크 호출 또는 데이터베이스의 데이터 처리와 같은 장기 실행 작업을 실행하는 동안 앱의 응답성을 유지하는 비동기 작업을 실행하는 코드를 단순화하기 위해 Android에서 사용할 수 있는 동시성 디자인 패턴입니다.

장기 실행 작업을 관리하는 코루틴 도움말 및 UI(사용자 인터페이스)는 장기 실행 작업을 실행하는 동안 응답성이 뛰어나고 사용자에게 피드백을 제공하므로 사용자는 앱이 많은 시간이 소요되는 장기 실행 작업을 수행하고 있음을 알 수 있습니다.

코루틴은 다음과 같은 문제를 해결할 수 있습니다.

  • 장기 실행 작업(네트워크 요청, 데이터베이스에서 데이터 읽기)
  • Main-safety, 메인 스레드에서 일시 중단 기능을 호출하기 위해 저장합니다.

장기 실행 작업 관리

코루틴은 두 개의 새로운 작업을 추가하여 일반 기능을 기반으로 합니다. invoke(또는 호출) 및 return 외에도 코루틴은 suspendresume를 추가합니다.

suspend — 현재 코루틴의 실행을 일시 중지하고 모든 지역 변수를 저장합니다.

resume — 일시 중지된 위치에서 일시 중지된 코루틴을 계속합니다.

다른 suspend 함수나 launch과 같은 코루틴 빌더를 사용하여 새 코루틴을 시작하여 suspend 기능을 호출할 수 있습니다.

다음 예는 가상의 장기 실행 작업에 대한 간단한 코루틴 구현을 보여줍니다.

suspend fun fetchDocs() {                             
    val result = get("https://developer.android.com")
    show(result)                                   
}

suspend fun get(url: String) = withContext(Dispatchers.IO) { 
/* ... */ 
}

안전을 위한 코루틴

Kotlin에서 모든 코루틴은 기본 스레드에서 실행 중일 때도 디스패처에서 실행되어야 합니다. 코루틴은 스스로를 일시 중단할 수 있으며 디스패처는 코루틴을 재개할 책임이 있습니다.

코루틴이 실행되어야 하는 위치를 지정하기 위해 Kotlin은 사용할 수 있는 세 가지 디스패처를 제공합니다.

  • Dispatchers.Main — 이 디스패처를 사용하여 기본 Android 스레드에서 코루틴을 실행합니다. UI와 상호 작용하고 빠른 작업을 수행하는 데만 사용해야 합니다. 예에는 suspend 함수 호출, Android UI 프레임워크 작업 실행, LiveData 개체 업데이트가 포함됩니다.
  • Dispatchers.IO — 이 디스패처는 기본 스레드 외부에서 디스크 또는 네트워크 I/O를 수행하도록 최적화되어 있습니다. 예를 들어 Room 구성 요소 사용, 파일 읽기 또는 쓰기, 네트워크 작업 실행 등이 있습니다.
  • Dispatchers.Default — 이 디스패처는 메인 스레드 외부에서 CPU 집약적인 작업을 수행하도록 최적화되어 있습니다. 사용 사례의 예에는 목록 정렬 및 JSON 구문 분석이 포함됩니다. 이 블로그 게시물에서는 DataStore 의 작동 방식, 제공하는 구현 및 개별 사용 사례에 대해 자세히 살펴보겠습니다. SharedPreferences 또한 이것이 가져오는 이점과 개선 사항과 DataStore가 가치 있는 이유를 살펴보겠습니다.

코루틴 시작하기

다음 두 가지 방법 중 하나로 코루틴을 시작할 수 있습니다.

  • launch는 새로운 코루틴을 시작하고 호출자에게 결과를 반환하지 않습니다. “한번 사용되고 잊어버리는” 것으로 간주되는 모든 작업은 실행은 launch를 사용하여 시작할 수 있습니다.
  • async는 새 코루틴을 시작하고 await이라는 일시 중단 함수를 사용하여 결과를 반환할 수 있도록 합니다.

다음은 MVVM 아키텍처와 함께 코루틴을 사용하는 예입니다.

   fun signIn(email: String, password: String) {
        loading.postValue(true)
        viewModelScope.launch(Dispatchers.IO){
            try {
                auth?.let { login->
                    login.signInWithEmailAndPassword(email, password)
                        .addOnCompleteListener { task: Task<AuthResult> ->
                            if (task.isSuccessful) {
                                _signInStatus.postValue(true)
                                // Sign in success, update UI with the signed-in user's information
                            } else {
                                _signInStatus.postValue(false)
                            }
                            loading.postValue(false)
                        }
                }
            } catch (e: Exception){
                loading.postValue(false)
            }
        }
    }

사용자를 인증하기 위해 네트워크 요청을 사용하므로 Dispatchers.Main 대신 Dispatchers.IO를 사용합니다.

Android의 모범 사례 코루틴은 Android의 코루틴 모범 사례

원본 글