fun startAsyncFunc() { launch { asyncFunc1() asyncFunc2() } } fun asyncFunc1() { ... } suspend fun asyncFunc2() { ... } Puedo terminar el trabajo sin suspend e incluso hace que la prueba sea más fácil (se puede probar sin agregar runBlocking .
Mis preguntas:
asyncFunc1 vs asyncFunc2 , ¿cuál es mejor y por qué?asyncFunc2 es mejor, ¿debería usar siempre suspend cada vez que se ejecute una función en las rutinas? En los lanzamientos recientes de Coroutines de Kotlin, observo que si un método no contiene ningún código de rutinas (como launch , async , etc.), el compilador se queja. This inspection reports a suspend modifier as redundant if no other suspend functions are called inside . Así que asumo que suspend solo debe usarse cuando es imprescindible.
Solo debe declarar su función suspend si es necesario. Diría que, ante la duda, si el compilador no te obliga, no uses suspend .
La mayoría de las veces, si tiene una buena razón para que su función se suspenda, significa que está haciendo algo que probablemente requiera que llame a funciones de suspensión como withContext de todos modos, o podría ser una función basada en devolución de llamada que expone como suspensión a través suspendCoroutine / suspendCancellableCoroutine . De cualquier manera, llamar a esas funciones lo obligaría a declarar su propia función suspend .
Tenga en cuenta que declarar una función suspend no permite que las personas que llaman hagan nada más de lo que podían hacer cuando su función no estaba suspendida. En todo caso, está limitando el uso de su función.
Una posible excepción a la regla "no lo use a menos que sea forzado" sería si está definiendo esta función como un método abierto (por ejemplo, en una interfaz) y espera que algunas implementaciones/anulaciones necesiten llamar a funciones de suspensión ellos mismos.
La palabra clave suspend significa que la rutina se puede suspender para su ejecución posterior.
Habiendo dicho eso, debe usarlo conscientemente para corrutinas que se suspenderán (por ejemplo, su asyncFunc2() hizo una llamada HTTP y está esperando respuesta para procesarlo)
Asi que.
suspend para funciones que se retrasarán de alguna manera (en espera de algunos cálculos, respuesta de API, etc.)suspend fun solo se puede ejecutar desde coroutine. Entonces, si se suspende, bloqueará la rutina. Elimine la palabra clave de suspend , pero ejecútela en la rutina y tendrá el mismo efecto. Sin embargo, si ejecuta esta función desde fuera de la rutina, bloqueará el subproceso en el que se estaba ejecutando. Al probar rutinas, siempre debe invocar runBlocking . Si no lo hace, es posible que no se complete una rutina que se suspenda, lo que resultará en una prueba fallida.
Use la palabra clave suspender para:
funciones que se retrasarán de alguna manera (en espera de algunos cálculos, solicitudes de red)
La regla general es no marcar una función suspendida a menos que se vea obligado a hacerlo.