Sobes.tech
Middle

Kokios pagrindinės klasės yra Kotlin Coroutines?

sobes.tech AI

Atsakymas iš AI

Pagrindiniai Kotlin Coroutines klasės ir koncepcijos:

  • CoroutineScope: Nustato korutinų gyvavimo ciklą, pradėtą jo viduje. Leidžia atšaukti visas vaikų korutinas.

  • Job: Atstovauja nuorodą į korutiną. Leidžia stebėti jos būseną, laukti jos pabaigos, atšaukti.

  • Deferred: Ypatingas Job tipas, kuris atstovauja reikšmę, kuri bus prieinama vėliau. Naudojamas asinchroniniams skaičiavimams, grąžinantiems rezultatą. Rezultatą galima gauti naudojant .await() funkciją.

  • Dispatcher: Nustato srautą arba srautų baseiną, kuriame vykdoma korutina. Pagrindiniai dispečeriai:

    • Dispatchers.Default: Optimizuotas CPU intensyviems užduotims. Naudoja bendrą srautų baseiną.
    • Dispatchers.IO: Optimizuotas I/O operacijoms (tinklas, diskas). Naudoja tinkamą srautų skaičių.
    • Dispatchers.Main: Pagrindinis UI srautas. Skirtas UI atnaujinimui. Pasiekiamas Android ir kitose platformose su atitinkama priklausomybe.
    • Dispatchers.Unconfined: Pradeda korutiną dabartiniame sraute, bet ją atnaujina bet kuriame sraute, kuris atnaujino suspending-funkciją.
  • Suspending function: Funkcija, pažymėta raktiniu žodžiu suspend, ir gali būti sustabdyta bei vėl atnaujinta vėliau. Gali kviesti kitas suspending-funkcijas.

  • runBlocking: Blokuoja dabartinį srautą iki visų korutinų pabaigos. Naudojama dažniausiai testavimui ir main funkcijose.

  • launch: Paleidžia naują korutiną be dabartinio srauto blokavimo ir grąžina Job.

  • async: Paleidžia naują korutiną be dabartinio srauto blokavimo ir grąžina Deferred.

Pavyzdžiai:

// Pavyzdys naudojant CoroutineScope, launch ir Dispatchers.IO
import kotlinx.coroutines.*

fun main() = runBlocking {
    // Sukurti CoroutineScope
    val scope = CoroutineScope(Dispatchers.IO)

    // Paleisti korutiną IO dispečeryje
    val job: Job = scope.launch {
        // Vykdyti tinklo užklausą ar kitą I/O operaciją
        delay(1000) // Imituoja darbą
        println("Korutina baigėsi ${Thread.currentThread().name}")
    }

    // Laukti korutinos pabaigos
    job.join()
    println("Pagrindinė funkcija baigėsi")
}
// Pavyzdys naudojant async ir Deferred
import kotlinx.coroutines.*

fun main() = runBlocking {
    val deferredSum: Deferred<Int> = async {
        delay(500)
        1 + 1
    }

    // Laukti rezultato
    val result = deferredSum.await()
    println("Rezultatas yra: $result")
}