client utiliza el adaptador Coroutines Retrofit.
No entiendo, ¿por qué no recibo NetworkOnMainThreadException ? ¿No se llama en el hilo principal?
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val deferred = client.getStuffDeferred(file) CoroutineScope(Dispatchers.Main).launch { val response = deferred.await() } }Si pasa Coroutine Context a su constructor de coroutine, entonces tal coroutine usará ese hilo para la ejecución.
Es decir
newSingleThreadContext y newFixedThreadPoolContext .Executor arbitrario se puede convertir en despachador con la función de extensión asCoroutineDispatcher .Entonces, usa como:
CoroutineScope(Dispatchers.IO).launch { // we should use IO thread here ! }si llama al lanzamiento en Dispatchers.Main, se ejecuta en el subproceso principal pero suspende la ejecución para no bloquear el subproceso.
Para que este comportamiento no bloquee ni arroje NetworkOnMainThreadException porque no hay métodos de suspensión o método runBlocking en su CoroutineScope
Pero: debe cambiar su contexto durante la realización de una operación de red o cualquier operación pesada puede ralentizar la operación de subprocesos de la interfaz de usuario mediante el uso de
withContext(Dispatchers.IO){// your suspended calls}lo que le permite cambiar su contexto actual al hilo de fondo y continuar su trabajo en el hilo principal sin ningún problema
Eche un vistazo a este artículo sobre solution3 que usa Coroutine