async
создает сопрограмму и запускается в контексте сопрограммы, унаследованном от CoroutineScope
, дополнительные контекстные элементы могут быть указаны с помощью аргумента контекста.Если в контексте нет ни диспетчера, ни какого-либо другого ContinuationInterceptor
, то используется Dispatchers.Default
.
Если используется Dispatchers.Default
, то любая функция, которую вы вызываете в async
компоновщике, будет работать асинхронно.Для переключения контекстов вы можете использовать функцию withContext
:
async {
delay(5000)
withContext(Dispatchers.Main) {
// if we use `Dispatchers.Main` as a coroutine context next two lines will be executed on UI thread.
doSomething()
doAnotherThing()
}
}
Если async
работает в контексте Dispatchers.Main
, вам не нужно переключать контексты:
var job: Job = Job()
var scope = CoroutineScope(Dispatchers.Main + job)
scope.async {
delay(5000) // suspends the coroutine without blocking UI thread
// runs on UI thread
doSomething()
doAnotherThing()
}
Примечание : async
в основном используется для параллельного выполнения.Для запуска используется простой сопрограмма launch
строитель.Таким образом, вы можете заменить все функции async
в этих примерах на функцию launch
.Также для запуска сопрограммы с помощью async
Builder необходимо вызвать функцию await()
для объекта Deferred
, который возвращается функцией async
. Вот дополнительная информация .