En Kotlin, especifica el tipo de hilo en el que desea que se ejecute su código indicando qué despachador usar (IO, Main, etc.). De manera similar, con rxJava, también puede indicar en qué hilo se ejecutará. Sin embargo, con rxJava, generalmente ejecutará algo en un hilo IO para hacer el trabajo en segundo plano, luego cambiará al hilo principal (que es el hilo de la interfaz de usuario) para mostrar cosas.

Pero he visto mucho código donde una corrutina usa solo el hilo principal. No cambia de un subproceso IO al subproceso principal. No he visto esto hecho en rxJava, aunque estoy seguro de que existe.

Pero mi pregunta es ¿por qué harías esto? Si solo va a usar el hilo principal, ¿por qué molestarse en usar una corrutina o rxJava? ¿No es lo mismo ejecutar una corrutina en el hilo principal que ejecutarla en el hilo principal sin una corrutina?

2
AndroidDev 27 oct. 2019 a las 14:25

1 respuesta

La mejor respuesta

He visto mucho código donde una corrutina usa solo el hilo principal.

Muy a menudo, una corrutina invocará código que se ejecuta en otro hilo como Dispatchers.IO, pero generalmente ocurre "bajo el capó". Por ejemplo, considere el siguiente código de documentos de Android:

suspend fun fetchDocs() {
    val result = get("https://developer.android.com")
    show(result)
}

A primera vista, podría parecer que esta corrutina no cambia de hilo. Pero cuando observa la implementación de get(), puede ver que sí cambia de hilo:

suspend fun get(url: String) = withContext(Dispatchers.IO) { /* ... */ }

Si profundiza en el código que ha visto, virtualmente siempre encontrará un cambio a un grupo de subprocesos de trabajo como Dispatchers.IO (de lo contrario, no tiene sentido usar corrutinas como usted señala).

Pero mi pregunta es ¿por qué harías esto?

El motivo por el que la mayoría de los creadores de rutinas, como viewModelScope utilizan de forma predeterminada el uso de Dispatchers.Main se debe a que no tiene que preocuparse por la seguridad de los subprocesos para su "código de nivel superior". El patrón general es "ejecutar todas las corrutinas en Dispathers.Main, pero cambiar a, por ejemplo, Dispathers.IO debajo del capó cuando sea necesario para no bloquear el hilo Main".

De esa manera, puede tener un código simple. En el ejemplo anterior, el método show(result) no necesita ser seguro para subprocesos, porque solo se usará desde el subproceso Main.

No hay ningún problema con la ejecución de código en el subproceso principal siempre que el código no bloquee el subproceso principal, lo que generalmente significa "no realiza E / S de disco o red".

2
Enselic 27 oct. 2019 a las 12:52