나만 보는 일기장

Coroutine 복습하면서 적는 내용 본문

개발/Android

Coroutine 복습하면서 적는 내용

Patrick0422 2021. 9. 26. 04:46

.launch는 Job 객체를 반환 → Job을 통해 작업 컨트롤 가능

.async는 Defferd<T> 객체를 반환 → .await() 통해 Defferd에 값이 들어옴. 

 

coroutineScope {}: 값 반환 전에 모든 자식 코루틴들이 완료됨을 보장해줌

structured concurrency를 위해 사용

 

structured concurrency
→ 여러 코루틴을 한번에 실행할 때 모든 작업이 완료됨을 보장받기 위해 사용

 

구조:

메인 쓰레드에서 여러 작업을 하는 suspend 함수를 호출 
→ 함수는 coroutineScope 안에서 여러 작업들을 시작한다. 
그러면 coroutineScope가 하위 작업들이 모두 완료된 후 값을 반환

 

장점:
예외 처리가 가능하고, 작업 취소도 쉽다

 


viewModelScope

ViewModel에서 Coroutine을 사용할 때, ViewModel의 생명주기가 끝나도
ViewModel에서 실행된 몇몇의 Coroutine이 경우에 따라 남게 될 수도 있음. 
의도적으로 그렇게 한 것일 수도 있겠지만 그렇지 않다면 이는 메모리 누수가 된다.

 

이를 막기 위해서는 ViewModel의 생명주기가 끝날 때 호출되는 onCleared() 함수를 오버라이딩 해서

수동으로 모든 Job을 취소해주면 된다.

 

하지만 만약 ViewModel이 몇십개나 된다면 곤란할 것이다.

 

그래서 viewModelScope를 쓴다.

viewModelScope는 ViewModel의 생명주기를 따르고, 자신의 스코프 내의 작업 취소를 알아서 해준다.

 

lifecycleScope

비슷하게 lifecycleScope는 실행되는 곳의 생명주기를 따라 작동된다. (액티비티, 프래그먼트 등)

Comments