CoroutineContext
: 코루틴의 동작을 정의하는 요소 집합
안드로이드에서 컨텍스트(Context) 처럼 코루틴의 Context라고 이해하면 쉽다.
+) 안드로이드에서 컨텍스트(Context) 무엇인가?
이름 그대로 해석한다면 애플리케이션(객체)의 현재 상태의 맥락(context)를 의미합니다. 컨텍스트는 새로 생성된 객체가 지금 어떤 일이 일어나고 있는지 알 수 있도록 합니다. 따라서 액티비티와 애플리케이션에 대한 정보를 얻기 위해서는 컨텍스트를 사용하면 됩니다.
- 코루틴의 영구적 context로 코루틴에서 사용할 여러 정보값들을 가지고 있다.
- 코루틴마다 ConroutineContxt 인터페이스로 표현되는 context과 연관되어 있다.
- 코루틴 영역(CoroutineScope)에서 coroutineContext 프로퍼티를 통해 접근 가능하다.
- 싱글톤 컨텍스트이다.
CoroutineContext 구성
- Element 인스턴스 의 인덱스 집합으로 키에 매핑되어 있는 불변 컬렉션
/**
* Key for the elements of [CoroutineContext]. [E] is a type of element with this key.
*/
public interface Key<E : Element>
/**
* An element of the [CoroutineContext]. An element of the coroutine context is a singleton context by itself.
*/
public interface Element : CoroutineContext {
/**
* A key of this coroutine context element.
*/
public val key: Key<*>
public override operator fun <E : Element> get(key: Key<E>): E? =
@Suppress("UNCHECKED_CAST")
if (this.key == key) this as E else null
public override fun <R> fold(initial: R, operation: (R, Element) -> R): R =
operation(initial, this)
public override fun minusKey(key: Key<*>): CoroutineContext =
if (this.key == key) EmptyCoroutineContext else this
}
CoroutineContext.Element
ㄴ> 대표적인 Element
1) Job : 코루틴을 고유하게 식별, 수명 주기를 관리, 취소 가능한 실행작업 표현 2) Dispatcher : 스레드와의 연관을 제어 |
ㄴ> get(키값)을 전달하여 획득가능
runBlocking {
coroutineContext[Job.Key]?.isActive
}
ㄴ> 아무값이나 저장가능
CoroutineContext 데이터 생성
- plus() 함수나 '+' 연산자를 사용
launch(coroutineContext + CoroutineName("CoCo")) {
...
}
CoroutineContext 데이터 제거
- minusKey()함수 사용
runBlocking {
coroutineContext.minusKey(Job.Key)
}
CoroutineContext 변경
- 코루틴 실행 중 withContext()에 새 context와 일시중단람다를 넘겨 context를 전환가능
ㄴ> withContext()
public suspend fun <T> withContext(
context: CoroutineContext,
block: suspend CoroutineScope.() -> T
): T
- 특정 블록을 다른 스레드에서 실행하고 싶을 때 유용
[참조]
- https://kotlinlang.org/docs/coroutines-basics.html#your-first-coroutine
- https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.coroutines/-coroutine-context/
-https://shinjekim.github.io/android/2019/11/01/Android-context%EB%9E%80/
-
https://developer.android.com/kotlin/coroutines/coroutines-adv?hl=ko#job
- https://shinjekim.github.io/android/2019/11/01/Android-context%EB%9E%80/