KOTLIN_LIB Telegram 522
🧡 Kotlin Coroutines Π±Π΅Π· макияТа: Ρ‡Ρ‚ΠΎ скрываСтся ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ

Когда Π²Ρ‹ запускаСтС ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ launch ΠΈΠ»ΠΈ async, компилятор Kotlin создаёт ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ интСрфСйс Continuation. Π­Ρ‚ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ содСрТит состояниС выполнСния ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ ΠΈ позволяСт Π΅ΠΉ ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΈ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒΡΡ. Π’Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅Π³ΠΎ хранятся всС Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ тСкущая Ρ‚ΠΎΡ‡ΠΊΠ° выполнСния.

πŸ”„ Π–ΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹:
1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ β€” с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ launch ΠΈΠ»ΠΈ async.
2. Запуск β€” автоматичСски ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· start().
3. ΠŸΡ€ΠΈΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° β€” ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ suspend -Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ delay() ΠΈΠ»ΠΈ await().
4. Π’ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ β€” послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ асинхронной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.
5. Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ β€” ΠΊΠΎΠ³Π΄Π° вСсь ΠΊΠΎΠ΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ ΠΈΠ»ΠΈ ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Π° ΠΎΡ‚ΠΌΠ΅Π½Π΅Π½Π°.

🧠 Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Continuation?

Continuation β€” это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ состояниС выполнСния ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹. Он позволяСт ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΈ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, сохраняя ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΎΠΌ, Π³Π΄Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Π° Π±Ρ‹Π»Π° приостановлСна. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Continuation выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:


interface Continuation<in T> {
val context: CoroutineContext
fun resumeWith(result: Result<T>)
}


πŸ“Œ ΠŸΡ€ΠΈΠΌΠ΅Ρ€:


suspend fun mySuspendFunction() {
println("Start")
delay(1000)
println("End")
}

launch {
mySuspendFunction()
}


ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ этот ΠΊΠΎΠ΄ Π² класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:


class GeneratedContinuation extends SuspendLambda {
int label;

@Override
Object invokeSuspend(Object result) {
switch (label) {
case 0:
println("Start");
label = 1;
if (delay(1000, this) == COROUTINE_SUSPENDED)
return COROUTINE_SUSPENDED;
case 1:
println("End");
return Unit.INSTANCE;
}
throw new IllegalStateException();
}
}


Π—Π΄Π΅ΡΡŒ label ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ выполнСния Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹. ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ suspend -Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ label измСняСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, с ΠΊΠ°ΠΊΠΎΠ³ΠΎ мСста Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ послС приостановки.

https://habr.com/ru/articles/882988/

✍️ @kotlin_lib
πŸ‘5



tgoop.com/kotlin_lib/522
Create:
Last Update:

🧡 Kotlin Coroutines Π±Π΅Π· макияТа: Ρ‡Ρ‚ΠΎ скрываСтся ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ

Когда Π²Ρ‹ запускаСтС ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρƒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ launch ΠΈΠ»ΠΈ async, компилятор Kotlin создаёт ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰ΠΈΠΉ интСрфСйс Continuation. Π­Ρ‚ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ содСрТит состояниС выполнСния ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ ΠΈ позволяСт Π΅ΠΉ ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΈ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒΡΡ. Π’Π½ΡƒΡ‚Ρ€ΠΈ Π½Π΅Π³ΠΎ хранятся всС Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ тСкущая Ρ‚ΠΎΡ‡ΠΊΠ° выполнСния.

πŸ”„ Π–ΠΈΠ·Π½Π΅Π½Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹:
1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ β€” с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ launch ΠΈΠ»ΠΈ async.
2. Запуск β€” автоматичСски ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· start().
3. ΠŸΡ€ΠΈΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° β€” ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ suspend -Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ delay() ΠΈΠ»ΠΈ await().
4. Π’ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ β€” послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ асинхронной ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ.
5. Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ β€” ΠΊΠΎΠ³Π΄Π° вСсь ΠΊΠΎΠ΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ ΠΈΠ»ΠΈ ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Π° ΠΎΡ‚ΠΌΠ΅Π½Π΅Π½Π°.

🧠 Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Continuation?

Continuation β€” это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ состояниС выполнСния ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹. Он позволяСт ΠΏΡ€ΠΈΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΈ Π²ΠΎΠ·ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, сохраняя ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΎΠΌ, Π³Π΄Π΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Π° Π±Ρ‹Π»Π° приостановлСна. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ Continuation выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:


interface Continuation<in T> {
val context: CoroutineContext
fun resumeWith(result: Result<T>)
}


πŸ“Œ ΠŸΡ€ΠΈΠΌΠ΅Ρ€:


suspend fun mySuspendFunction() {
println("Start")
delay(1000)
println("End")
}

launch {
mySuspendFunction()
}


ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ этот ΠΊΠΎΠ΄ Π² класс, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:


class GeneratedContinuation extends SuspendLambda {
int label;

@Override
Object invokeSuspend(Object result) {
switch (label) {
case 0:
println("Start");
label = 1;
if (delay(1000, this) == COROUTINE_SUSPENDED)
return COROUTINE_SUSPENDED;
case 1:
println("End");
return Unit.INSTANCE;
}
throw new IllegalStateException();
}
}


Π—Π΄Π΅ΡΡŒ label ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ выполнСния Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹. ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ suspend -Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ label измСняСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, с ΠΊΠ°ΠΊΠΎΠ³ΠΎ мСста Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ послС приостановки.

https://habr.com/ru/articles/882988/

✍️ @kotlin_lib

BY Kotlin


Share with your friend now:
tgoop.com/kotlin_lib/522

View MORE
Open in Telegram


Telegram News

Date: |

In the next window, choose the type of your channel. If you want your channel to be public, you need to develop a link for it. In the screenshot below, it’s ”/catmarketing.” If your selected link is unavailable, you’ll need to suggest another option. Administrators Write your hashtags in the language of your target audience. Telegram Channels requirements & features Find your optimal posting schedule and stick to it. The peak posting times include 8 am, 6 pm, and 8 pm on social media. Try to publish serious stuff in the morning and leave less demanding content later in the day.
from us


Telegram Kotlin
FROM American