https://developer.android.com/codelabs/basic-android-kotlin-training-introduction-coroutines?hl=ko#0
참고!
Dispatchers.Main
Dispatchers.IO
import kotlinx.coroutines.*
import java.net.URL
fun main() {
// IO 디스패처를 사용하여 네트워크 요청을 비동기적으로 처리
val job = GlobalScope.launch(Dispatchers.IO) {
val result = fetchDataFromNetwork("https://jsonplaceholder.typicode.com/todos/1")
println("Result from network: $result")
}
// 메인 스레드는 여기서 다른 작업을 수행할 수 있음
// job을 기다림
runBlocking {
job.join()
}
}
suspend fun fetchDataFromNetwork(urlString: String): String {
return URL(urlString).readText()
}
=> 이러한 IO 코루틴의 장점은 다음과 같다.
[1] 스레드 관리
[2] 자원 효율성
[3] 병렬 처리
Dispatchers.Default
비동기 작업 처리: ViewModel 내에서 비동기 작업(예: 네트워크 요청, 데이터베이스 액세스)을 수행하는 경우, 이 작업을 메인 스레드에서 동기적으로 실행하면 UI 스레드가 차단될 수 있습니다. 이로 인해 ANR(Application Not Responding)이 발생할 수 있습니다.
데이터 로드 순서: ViewModel에서 데이터를 비동기적으로 로드할 때, 이 작업이 UI 스레드에서 실행되어야 할 UI 업데이트 작업보다 먼저 완료될 경우 문제가 발생할 수 있습니다. 예를 들어, UI가 데이터를 기대하는 상태에서 데이터가 아직 로드되지 않은 경우 UI가 올바르게 표시되지 않을 수 있습니다.
레이스 컨디션(Race Condition): 비동기적으로 데이터를 처리하지 않으면, 동시에 여러 요청이 발생할 때 데이터의 상태가 일관성 없이 변경될 수 있습니다. 예를 들어, 두 개 이상의 요청이 동시에 데이터를 수정하려고 할 때, 예상하지 못한 결과가 발생할 수 있습니다.
UI 업데이트 문제: 데이터 로딩이 완료된 후에 UI를 업데이트해야 할 때, 비동기 작업을 사용하지 않으면 데이터가 준비되기 전에 UI를 업데이트하려고 시도할 수 있습니다. 이로 인해 UI가 부정확하게 표시될 수 있습니다.
https://velog.io/@haero_kim/Thread-vs-Coroutine-%EB%B9%84%EA%B5%90%ED%95%B4%EB%B3%B4%EA%B8%B0