【问题标题】:Coroutine, No Android, Module with the Main dispatcher is missing协程,没有 Android,缺少主调度程序的模块
【发布时间】:2022-01-01 12:13:32
【问题描述】:

我正在尝试在 IntellJ 的 Kotlin 控制台项目中测试协程。我添加了这个库:org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.0。它起作用了,直到我使用了Dispatchers.Main。添加后,它抛出了运行时异常。

import kotlinx.coroutines.*
val scope = CoroutineScope(Dispatchers.Main);
fun main(args: Array<String>) {
    scope.launch {  }
}

java.lang.IllegalStateException:缺少主调度程序的模块。添加提供主要调度程序的依赖项,例如'kotlinx-coroutines-android' 并确保它与 'kotlinx-coroutines-core' 具有相同的版本

按照现有答案的建议,我用org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.0 切换了库,但随后它引发了不同的运行时错误。

NoClassDefFoundError: android/os/Looper

该库似乎适用于 Android。使用 'kotlinx-coroutines-android' 是 Kotlin 控制台项目的正确解决方案吗?如果不是,我该如何解决这个问题?

【问题讨论】:

  • 很明显,你不能在非android目标上使用android版本。正如文档所说:“kotlinx.coroutines 的核心模块也可用于 Kotlin/JS 和 Kotlin/Native。”在您的情况下,您可能需要各种原生 - 似乎支持所有流行的类似 Posix 的目标。
  • 也许这会回答你的问题? stackoverflow.com/a/54194735/1731626
  • @oakad 我说我在切换到安卓版本之前使用的是org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.0。你链接的那个和我用的一样,不是吗?上面的代码是否在 IntellJ 的 Kotlin 控制台项目中使用该库运行时没有运行时错误?
  • @Sergey 链接的答案提到了三件事:android、javafx 和 swing。这些似乎都是GUI的东西。我正在使用 Kotlin 控制台项目。你知道,一个只有println("hello world") 的项目。这是否意味着它必须是一个 GUI 项目才能使用 Dispatchers.Main?答案还提到了“...-core”,但那是我正在使用的东西,它导致了上面的运行时错误。

标签: kotlin kotlin-coroutines


【解决方案1】:

Dispatchers.Main 用于 GUI 应用程序,不支持控制台项目。 根据Guide to UI programming with coroutineskotlinx.coroutines 具有三个模块,为不同的 UI 应用程序库提供协程上下文:

使用runBlocking挂起main函数,直到协程被执行:

fun main(args: Array<String>) = runBlocking { ... }

【讨论】:

    【解决方案2】:

    Dispatchers.Main 很可能不是您想要的。它旨在在 GUI 应用程序的主事件循环上调度协程。

    对于控制台应用程序,尤其是您在此处共享的那种 sn-p,您可能希望使用主线程(在其中执行 main())作为事件循环,并防止 main()从返回直到协程完成。这是通过使用runBlocking 来完成的,它为外部代码阻塞当前线程,但将其用作CoroutineScope 的事件循环,以this 传递给您传递给runBlocking 的lambda。

    所以你的代码应该看起来像:

    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
        }
    }
    

    【讨论】:

      【解决方案3】:

      在你的依赖项gradle中导入kotlinx-coroutines-swing:(你的kotlin使用版本)并编译程序

      实现“org.jetbrains.kotlinx:kotlinx-coroutines-swing:$kotlin_coroutines_version”

      【讨论】:

        猜你喜欢
        • 2019-03-11
        • 2022-06-25
        • 2017-07-03
        • 2020-02-06
        • 2013-11-29
        • 2021-12-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多