Что такое CoroutineContext Kotlin

kotlin

Статья, объ­ясня­ющая, что такое CoroutineContext в Kotlin и что с этим делать.

РЕКОМЕНДУЕМ:

Ес­ли взгля­нуть на опре­деле­ние любого бил­дера корутин (launch, async, runBlocking и т. д.) в коде, то мож­но уви­деть, что их пер­вый аргу­мент — это CoroutineContext:

Так­же мы видим, что launch — это фун­кция‑рас­ширение CoroutineScope. И ее пос­ледний аргу­мент (собс­твен­но, сам блок кода) тоже выпол­няет­ся в области видимос­ти CoroutineScope.

А теперь взгля­нем на опре­деле­ние самого CoroutineScope:

. Да­же Continuation, оли­цет­воря­ющий собой корути­ны, тоже содер­жит в себе CoroutineContext: public interface Continuation {    public val context: CoroutineContext    public fun resumeWith(result: Result)}[/crayon]
Дру­гими сло­вами, CoroutineContext — это самый важ­ный эле­мент корути­ны. Но что это такое?

На самом деле CoroutineContext — это интерфейс для кол­лекции эле­мен­тов Element, где Element — это Job, CoroutineName, CouroutineDispatcher, SupervisorJob, CoroutineExceptionHandler или сам CoroutineContext.

Эле­мен­ты этой кол­лекции име­ют уни­каль­ный ключ. А для извле­чения эле­мен­тов мож­но исполь­зовать getили квад­ратные скоб­ки:

Как вид­но, в качес­тве клю­ча мож­но исполь­зовать прос­то имя клас­са. В Kotlin имя клас­са — это ссыл­ка на объ­ект‑ком­пань­он это­го клас­са, а в слу­чае с CoroutineContext объ­ект‑ком­пань­он как раз и содер­жит ключ:

Так­же CoroutineContext мож­но скла­дывать, при этом эле­мен­ты с сов­пада­ющи­ми клю­чами будут замене­ны на новые:

В целом CoroutineContext — это спо­соб переда­чи дан­ных меж­ду корути­нами. Такая переда­ча, нап­ример, осу­щест­вля­ется при запус­ке дочер­ней корути­ны:

Это код показы­вает, как задан­ное нами имя корути­ны (main) в ито­ге переда­ется всем ее потом­кам. Но если мы захотим, мы можем изме­нить это имя:

По сути, пра­вило здесь прос­тое: кон­текст корути­ны = кон­текст родите­ля + кон­текст потом­ка.

За­чем все это нуж­но знать? Нап­ример, для того, что­бы понимать, что дела­ет всем извес­тная фун­кция withContext. Обыч­но ее исполь­зуют для запус­ка кода в дру­гом потоке, нап­ример:

Эта фун­кция прос­то при­бав­ляет к сущес­тву­юще­му CorotuneContext дис­патчер Default, таким обра­зом заменяя прош­лый дис­патчер. Далее она запус­кает новую корути­ну уже в этом кон­тек­сте, и корути­на начина­ет работу в дру­гом потоке.

Те­перь ты дол­жен понимать, что вмес­то дис­петче­ра в аргу­мен­те этой фун­кции мож­но передать любой дру­гой Element, нап­ример тот же CoroutineName. То есть с ее помощью мож­но не толь­ко перенап­равлять корути­ны в новые потоки, но и менять любые их харак­терис­тики.

What is CoroutineContext and how does it work?

Понравилась статья? Поделиться с друзьями:
Добавить комментарий