-
Kotlin coroutine 의 핵심은 CoroutieContext interface 이다.
모든 launch, async 같은 coroutine builder 는 첫번째 param 으로 CoroutineContext 를 받는다.
이 coroutine builder 들은 CoroutineScope interface 의 extension function 으로 정의되어 있으며, abstract read-only property 로 coroutineContext 를 가지고 있다.
-
fun CoroutineScope.launch(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
onCompletion: CompletionHandler? = null,
block: suspend CoroutineScope.() -> Unit
): Job
-
fun <T> CoroutineScope.async(
context: CoroutineContext = EmptyCoroutineContext,
start: CoroutineStart = CoroutineStart.DEFAULT,
onCompletion: CompletionHandler? = null,
block: suspend CoroutineScope.() -> T
): Deferred<T>
-
CoroutineContext inteface 는 사실 type-safe heterogeneous indexed map 이다.
이는 CoroutineContext.Key -> CoroutineContext.Element 매핑이다.
여기서 CoroutineContext.Element 는 CoroutineContext 를 상속했다.
기존 Map 을 사용하지 않고 다시 이 녀석을 define 한 이유는..
type-safe 를 해주기 위해, get 이 다음과 같이 정의되었기 때문이다.
fun <E : Element> get(key: Key<E>): E?
-
plus operator 는 CoroutineContext instance 를 합친다.
left side 의 map 에 right side 의 map 을 부어 넣는다고 보면 된다.
-
Context 가 필요 없을 때는 EmptyCoroutineContext 를 사용하면 된다.
-
CoroutineContext 는 아래 요소들을 담고 있다.
ContinuationInterceptor
Job
CoroutineExceptionHandler
CoroutineName
class CoroutineContext(
val continuationInterceptor: ContinuationInterceptor?,
val job: Job?,
val coroutineExceptionHandler: CoroutineExceptionHandler,
val name: CoroutineName?
)
-
ContinuationInterceptor 는 continuation 을 위해 invoke 된다.
이것은 실행 thread 를 관리하기 위해 사용된다.
이 녀석은 CoroutineDispatcher 를 상속한다.
-
Job 은 coroutine 실행의 life-cycle 과 task hierarchy 를 모델링한다.
-
CoroutineExceptionHandler 는 coroutine builder 가 exception 을 전파하지 않기 위해 사용한다.
-
CoroutineName 은 debug 용도로 사용한다.
-
Coroutine builder 를 사용할 때 다음 3개의 context가 관여한다.
CoroutineContext 를 제공하기 위한 CoroutineScope receiver. 이는 inherited context 이다.
builder 는 첫번째 param 으로 CoroutineContext 를 받는다. 이를 context argument 라고 한다.
suspending block 은 CoroutineScope receiver 를 가진다. 이는 CoroutineContext 를 제공하며 이를 coroutine context 라고 부른다.
-
parent context = default values + inherited context + context argument
coroutine context = parent context + coroutine job
끝
참고 : https://proandroiddev.com/demystifying-coroutinecontext-1ce5b68407ad
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[android] ListView, RecyclerView 에서 top position 인지 판단하는 방법 (0) | 2022.12.27 |
---|---|
[android] AudioFocus 관리하기 (1) | 2022.02.14 |
[Android] Kotlin and Flow usage (0) | 2022.01.31 |
[Dagger] Assisted Injection (0) | 2022.01.28 |
[Hilt] Entry Points (0) | 2022.01.27 |
댓글