¿Hay alguna diferencia entre estos dos enfoques?
runBlocking { launch(coroutineDispatcher) { // job } } GlobalScope.launch(coroutineDispatcher) { // job }
runBlockingejecuta una nueva rutina y bloquea el subproceso actual de forma interrumpible hasta su finalización. Esta función no debe usarse desde coroutine. Está diseñado para unir el código de bloqueo regular con las bibliotecas que están escritas en estilo de suspensión, para usarse en las funciones principales y en las pruebas.
// line 1 runBlocking { // line 2 launch(coroutineDispatcher) { // line 3 } // line 4 } // line 5 someFunction() En caso de usar runBlocking , las líneas de código se ejecutarán en el siguiente orden:
line 1 line 2 line 4 line 3 line 5 // this line will be executed after coroutine is finishedEl alcance global se utiliza para lanzar corrutinas de nivel superior que funcionan durante toda la vida útil de la aplicación y no se cancelan prematuramente. Otro uso del alcance global son los operadores que se ejecutan en Dispatchers.Unconfined, que no tienen ningún trabajo asociado. El código de la aplicación generalmente debe usar CoroutineScope definido por la aplicación; se desaconseja enfáticamente usar async o iniciar en la instancia de GlobalScope.
// line 1 GlobalScope.launch(coroutineDispatcher) { // line 2 } // line 3 someFunction() En caso de utilizar GlobalScope.launch , las líneas de código se ejecutarán en el siguiente orden:
line 1 line 3 line 2 Por lo tanto, runBlocking bloquea el subproceso actual hasta su finalización, GlobalScope.launch no lo hace.