tgoop.com/kotlin_lib/522
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
