일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 프로세스
- flutter
- 뷰홀더
- appcompatacitivity
- appcompatactivity
- 내부 단편화
- Android
- AAC
- viewModelScope
- AsyncListDiffer
- http발전과정
- 디자인 패턴
- apk 빌드 과정
- recyclerview
- 안드로이드
- NestedScrollView
- 플로이드워셜
- 절대 주소
- 상태관리
- Dispatchers
- 자이고트
- GetX
- Kotlin
- 데코레이터 패턴
- 물리 메모리
- 운영체제
- http 역사
- 리사이클러뷰
- 리사이클러뷰풀
- DiffUtil
- Today
- Total
hong's android
[안드로이드] viewModelScope에 대해서 알아보자 본문
viewModelScope는 viewmodel이 파괴되는 시점에 내부에서 실행했던 코루틴들을 모두 종료합니다.
매번 viewmodelscope를 통해 코루틴을 실행하는 만큼 viewModelScope 내부 구조를 공부하며 동작에 대한 이해를 확실히 하려고합니다.
먼저 viewModelScope의 내부입니다.
public val ViewModel.viewModelScope: CoroutineScope
get() = synchronized(VIEW_MODEL_SCOPE_LOCK) {
getCloseable(VIEW_MODEL_SCOPE_KEY)
?: createViewModelScope().also { scope -> addCloseable(VIEW_MODEL_SCOPE_KEY, scope) }
}
getCloseable()을 통해 기존에 저장된 뷰모델 스코프가 존재하는지 VIEW_MODEL_SCOPE_KEY를 기준으로 조회합니다.
(내부엔 map 자료구조를 사용하여 coroutinescope를 저장합니다.)
만약 기존 스코프가 존재할 경우, 해당 코루틴 스코프를 가져와서 반환합니다. 존재하지 않을 경우엔, createViewModelScope()을 통해 새로운 코루틴 스코프를 생성합니다.
internal fun createViewModelScope(): CloseableCoroutineScope {
val dispatcher = try {
Dispatchers.Main.immediate
} catch (_: NotImplementedError) {
// In platforms where `Dispatchers.Main` is not available, Kotlin Multiplatform will throw
// a `NotImplementedError`. Since there's no direct functional alternative, we use
// `EmptyCoroutineContext` to ensure a `launch` will run in the same context as the caller.
EmptyCoroutineContext
}
return CloseableCoroutineScope(coroutineContext = dispatcher + SupervisorJob())
}
internal class CloseableCoroutineScope(
override val coroutineContext: CoroutineContext,
) : AutoCloseable, CoroutineScope {
constructor(coroutineScope: CoroutineScope) : this(coroutineScope.coroutineContext)
override fun close() = coroutineContext.cancel()
}
새롭게 뷰모델 스코프를 생성하는 createViewModelScope() 내부 로직입니다. CloseableCoroutineScope 객체에 Dispatchers.Main.immediate와 SupervisorJob()를 넘겨주어, 스코프를 반환하는 것을 볼 수 있습니다.
즉, viewModelScope는 Dispatchers.Main.immediate + SupervisorJob의 CoroutineContext를 가지고 있습니다.
Dispatchers.Main.immediate 와 Dispachers.Main 차이점
Dispachers.Main와 Dispachers.Main.Immediate의 차이점은 코루틴 실행을 즉시 하는지, 스케쥴링을 통해 메인스레드가 free할 때 실행이 되는지의 차이입니다.
Dispatchers.Main.immediate vs Dispatchers.Main
Dispachers.Main.Immediate는 즉시 어떤 Ui를 업데이트 해야하는경우에 사용할 수 있고, ui 반응속도를 향상시키기는데에 사용할 수 있습니다.
GlobalScope.launch(Dispatchers.Main) {
// Update UI components
textView.text = "Updated Text"
}
'Android' 카테고리의 다른 글
[android] 오류 메시지 어떻게 보여줘야할까? (0) | 2024.11.03 |
---|