CoroutineScope 팩토리 함수
- CoroutineScope는 coroutineContext를 유일한 프로퍼티로 가지는 인터페이스임.
interface CoroutineScope {
val coroutineContext: CoroutineContext
}
- CoroutineScope 인터페이스를 구현한 클래스를 만들고 내부에서 코루틴 빌더를 직접 호출할 수 있음.
class SomeClass : CoroutineScope {
override val coroutineContext: CoroutineContext = Job()
fun onStart() {
launch {
..
}
}
}
- 위 방법은 CoroutineScope를 구현한 클래스에서 다른 CoroutineScope의 메서드(
cancel
, ensureActive
)를 직접 호출하면 문제가 발생할 수 있음.
- 전체 스코프를 취소하면 코루틴이 더 이상 시작될 수 없음.
- 위 방법 보단 코루틴 스코프 인스턴스를 프로퍼티로 가지고 있다가 코루틴 빌더를 호출할 때 사용하는 방법이 선호됨.
class SomeClass {
val scope: CoroutineScope = ...
fun onStart() {
scope.launch {
...
}
}
}
- 코루틴 스코프 객체를 만드는 가장 쉬운 방법은 CoroutineScope 팩토리 함수를 사용하는 것임.
안드로이드에서 스코프 만들기
- BaseViewModel에서 스코프를 만들면, 모든 뷰모델에서 쓰일 스코프를 단 한번으로 정의함.
- 전체 스코프 대신 스코프가 가지고 있는 자식 코루틴만 취소하는 것이 좋은 방법임.
scope.coroutineContext.cancelChildren()
- 독립적으로 작동할 땐
Job
대신 SupervisorJob
을 사용할 것.
- 잡히지 않는 예외가 있는경우 CEH를 사용해 해당 함수를 호출할 수 있음.
viewModelScope와 lifecycleScope
- 안드로이드 애플리케이션에 스코프를 따로 정의하는 대신
viewModelScope
, lifecycleScope
을 사용할 수 있음.
- 이는
Dispatchers.Main
과 SupervisorJob
을 사용하고, 뷰모델이나 라이프사이클이 종료되었을 때 잡을 취소시키는 메커즘임.
궁금한 부분