Sobes.tech
Назад к вопросам
Junior — Middle
60

Объясните механизм взаимодействия ключевых элементов async и await в обработке корутин.

Компании, где спрашивали
Viasat tech

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

async и await нужны, чтобы писать асинхронный код в линейном виде без явных callback’ов. async помечает функцию как корутину, а await приостанавливает её выполнение до завершения ожидаемой операции. При этом поток не блокируется: корутина “уступает” управление, а затем продолжает работу с того же места.

Определение:

async и await — это механизм, который позволяет корутинам выполнять длительные операции неблокирующим образом. async указывает, что функция может быть приостановлена и возобновлена, а await говорит: “подожди результат этой операции, но не блокируй поток”. В Android это обычно используют для работы с сетью, базой данных и другими задачами, которые нельзя выполнять на UI-потоке.

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

Например, нужно загрузить данные с сервера и затем обновить экран.

import kotlinx.coroutines.*

suspend fun loadUser(): String {
    delay(1000)
    return "User data"
}

fun main() = runBlocking {
    val result = async { loadUser() }
    println("Запрос отправлен")

    val data = result.await()
    println(data)
}

Пояснение кода:

  1. runBlocking запускает корутину в примере, чтобы код можно было выполнить как обычную программу.
  2. async { loadUser() } запускает асинхронную задачу и сразу возвращает объект, который представляет будущий результат.
  3. Внутри loadUser() вызывается delay(1000), это приостановка корутины без блокировки потока.
  4. println("Запрос отправлен") выполняется сразу, пока задача ещё не завершилась.
  5. result.await() приостанавливает текущую корутину до готовности результата и затем возвращает строку.
  6. После await() можно безопасно использовать данные, полученные асинхронно.

Ключевые моменты:

  • async запускает корутину параллельно с текущим контекстом и возвращает Deferred-результат.
  • await приостанавливает только корутину, а не поток.
  • async удобно использовать, когда нужен результат операции; launch — когда результат не нужен.
  • Коррутины позволяют писать асинхронный код последовательно и читаемо.
  • В Android это особенно полезно для работы с сетью, диском и БД без блокировки UI-потока.