Функция withContext
Функция withContext переключает контекст выполнения текущей корутины на указанный контекст,
выполняет переданный блок кода в этом контексте и возвращает результат. Является suspend-функцией,
поэтому может быть вызвана только из другой suspend-функции или корутины. Принимает два параметра:
контекст типа CoroutineContext и блок кода для выполнения.
Импорт
import kotlinx.coroutines.withContext
Синтаксис
suspend fun <T> withContext(
context: CoroutineContext,
block: suspend CoroutineScope.() -> T
): T
Пример
Переключение на контекст ввода-вывода для выполнения сетевой операции:
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import kotlinx.coroutines.runBlocking
fun main() = runBlocking {
val result = withContext(Dispatchers.IO) {
// Имитация сетевого запроса
"Data from network"
}
println("Result: $result")
}
Результат выполнения кода:
Result: Data from network
Пример
Переключение между разными диспетчерами:
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import kotlinx.coroutines.runBlocking
fun main() = runBlocking {
println("Current context: ${coroutineContext}")
val ioResult = withContext(Dispatchers.IO) {
println("IO context: ${coroutineContext}")
"IO operation completed"
}
val defaultResult = withContext(Dispatchers.Default) {
println("Default context: ${coroutineContext}")
"Computation completed"
}
println("$ioResult, $defaultResult")
}
Результат выполнения кода:
Current context: [BlockingCoroutine{Active}@1, BlockingEventLoop@2]
IO context: [Dispatchers.IO, BlockingCoroutine{Active}@1]
Default context: [Dispatchers.Default, BlockingCoroutine{Active}@1]
IO operation completed, Computation completed
Пример
Использование withContext для обработки исключений:
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import kotlinx.coroutines.runBlocking
fun main() = runBlocking {
try {
val result = withContext(Dispatchers.IO) {
throw RuntimeException("Network error")
}
} catch (e: Exception) {
println("Caught exception: ${e.message}")
}
}
Результат выполнения кода:
Caught exception: Network error
Пример
Комбинирование withContext с другими suspend-функциями:
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.withContext
import kotlinx.coroutines.runBlocking
fun main() = runBlocking {
val processedData = withContext(Dispatchers.Default) {
delay(1000) // Имитация тяжелых вычислений
"Processed data"
}
withContext(Dispatchers.IO) {
delay(500) // Имитация сохранения данных
println("Data saved: $processedData")
}
}
Результат выполнения кода:
Data saved: Processed data
Смотрите также
-
функцию
async,
которая запускает асинхронную операцию с возвратом результата -
функцию
coroutineScope,
которая создает область видимости для корутин