Функция withContext

Функция withContext переключает контекст выполнения текущей корутины на указанный контекст, выполняет переданный блок кода в этом контексте и возвращает результат. Является suspend-функцией, поэтому может быть вызвана только из другой suspend-функции или корутины. Принимает два параметра: контекст типа CoroutineContext и блок кода для выполнения.

Импорт

kotlinimport kotlinx.coroutines.withContext

Синтаксис

kotlinsuspend fun <T> withContext(
  context: CoroutineContext,
  block: suspend CoroutineScope.() -> T
): T

Пример

Переключение на контекст ввода-вывода для выполнения сетевой операции:

kotlinimport 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")
}

Результат выполнения кода:

kotlinResult: Data from network

Пример

Переключение между разными диспетчерами:

kotlinimport 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")
}

Результат выполнения кода:

kotlinCurrent 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 для обработки исключений:

kotlinimport 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}")
  }
}

Результат выполнения кода:

kotlinCaught exception: Network error

Пример

Комбинирование withContext с другими suspend-функциями:

kotlinimport 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")
  }
}

Результат выполнения кода:

kotlinData saved: Processed data

Смотрите также

  • функцию async,
    которая запускает асинхронную операцию с возвратом результата
  • функцию coroutineScope,
    которая создает область видимости для корутин