Шаг 265.
Основы Kotlin.
Знакомство с сопрограммами. Функция launch() против async()/await()

    На этом шаге мы рассмотрим особенности использования этих функций.

    Функции async() и launch(), которые были использованы для выполнения запроса и обновления UI, называются функциями-строителями сопрограмм (coroutine builder). Это функции, которые настраивают сопрограмму для определенной работы. Функция launch() создает и сразу запускает сопрограмму, которая выполняет указанную работу. В нашем случае она вызывает fetchCharacterDataAsync() и обновляет UI.

    Строитель сопрограммы async() работает иначе, создавая сопрограмму, которая возвращает тип Deferred, обозначающий еще не завершенную работу. Тип Deferred обещает, что работа будет выполнена в какой-то момент в будущем.

    Тип Deferred имеет функцию с именем await(), которая вызывается тогда, когда нужно дождаться завершения работы и получить результат. Функция await() приостанавливает выполнение следующей задачи (обновление UI) до тех пор, пока Deferred не завершит работу. Это означает, что вызов CharacterData() выполнится после получения ответа от веб-службы. Если вам знакома концепция Java Future, то Deferred - это почти то же самое.

    Несмотря на то что веб-запрос выполняется в фоновом режиме, вы смогли записать код в императивном стиле благодаря функции await(): дождались результата, а затем вызвали функцию обновления UI. Сравнивая это решение с более традиционным подходом (например, с использованием интерфейса обратных вызовов), вы смогли записать код, как если бы запрос к веб-службе выполнялся синхронно. Это стало возможным благодаря способности сопрограмм приостанавливать и возобновлять выполнение без блокировки потока.

    На следующем шаге мы рассмотрим функцию приостановки.




Предыдущий шаг Содержание Следующий шаг