ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 안드로이드 코루틴 Scope
    안드로이드 학습/Android 기술면접 대비 2024. 11. 15. 17:43

    코루틴 스코프 (Coroutine Scope)란 ?

    • 코루틴은 코루틴 스코프 안에서만 동작한다. 각 스코프는 특정 생명 주기를 가지며, 코루틴 실행을 위한 컨텍스트를 제공합니다.
    • 코루틴 스코프를 사용하기 위해서는 미리 정의된 코루틴 스코프를 사용하거나 직접 생성하는 방법이 있다.  
    • 코루틴 스코프 종류 : CoroutineScope, viewModelScope, lifecycleScope, GlobalScope 등등

    1. CoroutineScope

    • 특징 :
      • 명시적으로 정의한 스코프. 일반적으로 Job이나 Dispatchers를 사용하여 컨텍스트를 설정.
      • 부모-자식 관계를 설정할 수 있어 구조화된 동시성을 지원.
    • Dispatcher 종류 :  
      1. Main : 메인 스레드, 화면 ui 작업 등을 하는 곳
      2. IO : 네트워크, DB 등 백그라운드에서 필요한 작업을 하는 곳
      3. Default : 정렬이나 무거운 계산 작업 등을 하는 곳
    class DataLoader {
    
        private val scope = CoroutineScope(Dispatchers.IO + Job())
    
        fun loadData() {
            scope.launch {
                val data = fetchDataFromNetwork()
                println("Data loaded: $data")
            }
        }
    
        fun clear() {
            scope.cancel() // 작업 취소
        }
    
        private suspend fun fetchDataFromNetwork(): String {
            delay(1000)
            return "Network Data"
        }
    }

     

    2. viewModelScope

     

    • 특징:
      • ViewModel의 생명주기와 연결된 스코프입니다.
      • ViewModel이 메모리에서 해제되면 자동으로 코루틴이 취소됩니다.
    • 장점: ViewModel에 적합하며, 구조화된 동시성을 제공.

     

    class MyViewModel : ViewModel() {
    
        fun fetchData() {
            viewModelScope.launch {
                // 비동기 작업 (예: 네트워크 요청)
                val result = fetchDataFromNetwork()
                println("Data fetched: $result")
            }
        }
    
        private suspend fun fetchDataFromNetwork(): String {
            // 네트워크 요청 시뮬레이션
            kotlinx.coroutines.delay(1000)
            return "Network Data"
        }
    }

    3. lifecycleScope

     

    • 특징:
      • LifecycleOwner(Activity 또는 Fragment)의 생명주기와 연결된 스코프입니다.
      • onDestroy() 등의 이벤트에서 자동으로 코루틴이 취소됩니다.
    • 장점: UI와 직접 연결된 작업 처리에 적합.
    • 사용 사례: Activity나 Fragment에서 UI 업데이트, 데이터 로드 등

     

    class MainActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
            lifecycleScope.launch {
                // 비동기 작업
                val result = loadData()
                println("Data loaded: $result")
            }
        }
    
        private suspend fun loadData(): String {
            // 데이터 로드 시뮬레이션
            kotlinx.coroutines.delay(1000)
            return "Loaded Data"
        }
    }

     

    lifecycleScope를 사용하면 수명 주기와 연관된 안드로이드 구성 요소(예: 액티비티, 프래그먼트)의 수명 주기를 기반으로 코루틴을 실행 가능

     

    이는 구성 요소의 수명 주기가 활성 상태인 동안에만 코루틴이 실행되고, 구성 요소가 파괴되거나 비활성 상태가 되면 자동으로 해당 코루틴이 취소됩니다.

     

    4. GlobalScope

    • 특징
      • GlobalScope는 CoroutineScope의 한 종류로써 가장 큰 특징은 Application이 시작하고 종료될 때까지 계속 유지
      • Singletone 이기 때문에 따로 생성하지 않아도 되며 어디에서든 바로 접근이 가능
      • 애플리케이션의 생명 주기와 함께 지속됨.
    • 주의할 점 :
      • 메모리 누수의 원인이 될 수 있기 때문에 신중히 사용해야 한다.
      • 즉 앱이 실행된 이 후 계속 수행이 되어야 한다면 GlobalScope 를 사용해야 하는 것이고 특정 Activity나 Service 에서만 잠깐 사용하는 것이라면 GlobalScope를 사용하면 안된다.
    fun main() {
        GlobalScope.launch {
            delay(1000)
            println("GlobalScope: 실행 완료")
        }
        Thread.sleep(2000) // 코루틴 실행 대기
    }
Designed by Tistory.