Кои са основните класове в 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")
}