Sobes.tech
Middle

Кои са основните класове в Kotlin Coroutines?

sobes.tech AI

Отговор от AI

Основни класове и концепции в Kotlin Coroutines:

  • CoroutineScope: Определя жизнения цикъл на корутините, стартирани вътре в него. Позволява да се отменят всички дочерни корутини.

  • Job: Представлява хендъл към корутината. Позволява да се следи нейното състояние, да се изчака завършването й, да се отменя.

  • Deferred: Специален тип Job, който представлява стойност, която ще бъде достъпна по-късно. Използва се за асинхронни изчисления, които връщат резултат. Резултатът може да се получи с функцията .await().

  • Dispatcher: Определя нишката или пул от нишки, в който се изпълнява корутината. Основните диспетчери:

    • Dispatchers.Default: Оптимизиран за CPU-интензивни задачи. Използва общ пул от нишки.
    • Dispatchers.IO: Оптимизиран за I/O операции (мрежа, диск). Използва подходящ брой нишки.
    • Dispatchers.Main: Основната нишка на UI. За актуализиране на UI. Достъпен на платформи като Android и други с подходяща зависимост.
    • Dispatchers.Unconfined: Стартира корутината в текущата нишка, но я възобновява в която и да е нишка, която възобнови suspending-функцията.
  • Suspending function: Функция, която е маркирана с ключовата дума suspend и може да бъде спряна и възобновена по-късно. Може да извиква други suspending-функции.

  • runBlocking: Блокира текущата нишка до завършването на всички корутини в нейната област. Използва се основно за тестове и в main функции.

  • launch: Стартира нова корутина без блокиране на текущата нишка и връща Job.

  • async: Стартира нова корутина без блокиране на текущата нишка и връща Deferred.

Пример за използване:

// Пример за използване на CoroutineScope, launch и Dispatchers.IO
import kotlinx.coroutines.*

fun main() = runBlocking {
    // Създаване на CoroutineScope
    val scope = CoroutineScope(Dispatchers.IO)

    // Стартиране на корутина в IO диспетчера
    val job: Job = scope.launch {
        // Изпълнение на мрежова заявка или друга I/O операция
        delay(1000) // Имитация на работа
        println("Корутина завърши в ${Thread.currentThread().name}")
    }

    // Изчакване корутината да завърши
    job.join()
    println("Главната функция приключи")
}
// Пример за използване на async и Deferred
import kotlinx.coroutines.*

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

    // Изчакване на резултата
    val result = deferredSum.await()
    println("Резултатът е: $result")
}