Мне нужно проделать большую работу в асинхронном потоке
На самом деле асинхронного потока не существует. Независимо от того, являются ли ваши сетевые операции синхронизированными или асинхронными, определяется реализацией используемого вами сетевого API.
Если у вас есть блокирующая сетевая операция, она останется блокированной даже при применении сопрограмм. Значение сопрограмм для этого варианта использования ограничено упрощением передачи результата обратно в поток пользовательского интерфейса.
Этого можно добиться, запустив сопрограмму с диспетчером пользовательского интерфейса (по умолчанию) и затем переключивв пул потоков для выполнения операции блокировки без блокировки потока пользовательского интерфейса:
viewModelScope.launch {
countriesList.value = withContext(Dispatchers.IO) {
model.getAllCountries()
}
}
Обратите внимание, что поток в пуле потоков, лежащий в диспетчере IO
, по-прежнему будет заблокирован, поэтому с точки зрения использованиясистемные ресурсы это не имеет значения. Будет заблокировано столько же собственных потоков, сколько и одновременных сетевых вызовов.