Estoy tratando de probar Coroutine en el proyecto de consola Kotlin en IntellJ. He agregado esta biblioteca: org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.0. Funcionó, hasta que usé Dispatchers.Main . Después de agregarlo, lanzó una excepción de tiempo de ejecución.
import kotlinx.coroutines.* val scope = CoroutineScope(Dispatchers.Main); fun main(args: Array<String>) { scope.launch { } }java.lang.IllegalStateException: falta el módulo con el despachador principal. Agregue la dependencia que proporciona el despachador principal, por ejemplo, 'kotlinx-coroutines-android' y asegúrese de que tenga la misma versión que 'kotlinx-coroutines-core'
Cambié la biblioteca con org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0 como sugirió la respuesta existente, pero luego arrojó un error de tiempo de ejecución diferente.
NoClassDefFoundError: android/OS/Looper
Parece que la biblioteca es para Android. ¿Usar 'kotlinx-coroutines-android' es la solución correcta para el proyecto de consola Kotlin? Si no es así, ¿cómo soluciono el problema?
Dispatchers.Main está diseñado para aplicaciones GUI, no es compatible con el proyecto de consola. Según la Guía para la programación de UI con coroutines, kotlinx.coroutines tiene tres módulos que brindan contexto de coroutine para diferentes bibliotecas de aplicaciones de UI:
Use runBlocking para suspender la función main hasta que se ejecuten las rutinas:
fun main(args: Array<String>) = runBlocking { ... }Dispatchers.Main probablemente no sea lo que busca aquí. Está destinado a enviar corrutinas en el bucle de eventos principal en las aplicaciones GUI.
Para las aplicaciones de consola, y especialmente en el tipo de fragmento que está compartiendo aquí, probablemente desee usar el subproceso principal (en el que main() se ejecuta) como el bucle de eventos, y evitar que main() regrese hasta que las corrutinas estén hecho. Esto se hace usando runBlocking , que bloquea el subproceso actual para el código externo, pero lo usa como un bucle de eventos para el CoroutineScope pasado this a la lambda que pasa a runBlocking .
Por lo tanto, su código probablemente debería verse así:
import kotlinx.coroutines.* fun main() { runBlocking { // this: CoroutineScope // there is a CoroutineScope here, the receiver is implicit launch { // this code will run in the main thread, // concurrently with other coroutines and other code // in the runBlocking lambda } // this code will run in the main thread, // concurrently with the launch and other coroutines } }Importe kotlinx-coroutines-swing: (su versión de uso de kotlin) en su gradle de dependencias y compile el programa
implementación "org.jetbrains.kotlinx:kotlinx-coroutines-swing:$kotlin_coroutines_version"