если вы вызываете launch на Dispatchers.Main, он запускается в основном потоке, но приостанавливает выполнение, чтобы не блокировать поток.
Так, чтобы это поведение не блокировало и не генерировало исключение NetworkOnMainThreadException, посколькуне приостанавливать методы или методы runBlocking в вашем CoroutineScope
Но: вы должны изменить свой контекст во время выполнения сетевой операции или любой тяжелой операции, которая может замедлить работу потока пользовательского интерфейса с помощью
withContext(Dispatchers.IO){// your suspended calls}
, который позволяет вам изменить текущий контекст на фоновый поток и продолжить работу в основном потоке без каких-либо проблем.
Ознакомьтесь с этой статьей для Solution3, котораяиспользуйте сопрограмму