Android/Coroutine

[코루틴 기초] CoroutineContext (=코루틴 문맥, 코루틴 컨텐스트)

네모메모 2022. 7. 8. 21:54
반응형

 

 

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/

반응형