728x90
스코프 종류
LifecycleScope
GlobalScope은 topLevel 코루틴 이고 앱 라이프사이클중 항상 살아있음. LifecycleScope은 현재 라이프 사이클에서만 살아있는 코루틴
ViewModelScope
Viewmodel이 살아있는 동안 해당 뷰모델 객체의 생명주기를 따름
CoroutineScope(Dispachers)
작업이 끝나면 생명주기가 끝남
LifecycleOwner.lifecycleScope
해당 라이프사이클오너 객체의 생명주기를 따름
GlobalScope
앱의 생명주기를 따름
Dispachers
코루틴이 할당될 스레드풀 종류. 프레임워크 종속적임
Default
안드로이드 기본 스레드풀. CPU를 많이 쓰는 작업에 최적화 (데이터 정렬, 복잡한 연산 등...)
IO
데이터 입출력 작업에 최적화 (네트워킹, 파일 입출력 등...)
Main
안드로이드 메인 스레드. UI작업만 하는 게 좋음
안드로이드의 Looper.getMainLooper() 메서드를 사용 → 프레임워크 종속
Unconfined
자신을 호출한 context에서 돌아가다가 한번 정지가 되고 나면 해당 정지를 수행한 스레드로 옮겨가서 재동작한다.
사용 형태
launch { }
리턴값을 받을 필요 없는 작업시 사용 (==블로킹 불가)
Job이라는 리턴값이 있는데 이걸로 cancel()과 join() 가능
CoroutineScope(Dispachers.IO).launch {
// do something
}
async { }
리턴값을 받아 후속 작업을 해야 하는 작업시 사용 (==블로킹 가능)
private suspend fun getTrendingVideos(): List<Item> =
withContext(Dispatchers.IO) {
val responseData = async { RetrofitInstance.api.getTrendingVideos().items }
responseData.await()
}
Async를 사용했기때문에 deferred값을 리턴한다. deferred값을 리턴할 때는 await을 사용해줘야 한다. await은 스레드를 방해하지 않고 deferred값이 계산될 때까지, 기다리게 하는 함수.
- async 새로운 coroutine을 시작하고 GlobalScope.launch과 비슷하지만 , GlobalScope.launch처럼 job(백그라운드 작업)을 리턴하지않고 Deferred를 리턴함
- await() 비동기 함수의 실행을 일시 중지하고, 호출된 비동기 작업의 완료를 기다린다. 완료되면, 결과를 가져오고 코루틴의 실행을 재개한다.