没有Android操作系统的JavaFX + Kotlin协程,可能吗?

问题描述

我有一个可运行的 jar,它有一个用 javafx fxml 制作的用户界面和 kotlin 中的类代码,还有一些用 spring jpa 完成的数据库操作。

一切都很好,除了我不想在工作时阻塞主线程。来自 C# 我看到在 kotlin 中你可以像 async await 一样使用协程。


import javafx.fxml.FXML
import javafx.scene.control.Button
import kotlinx.coroutines.*

class appGui{
    @FXML
    private var buttonExecute: Button? = null

    @FXML
    fun buttonExecuteClick() {
       buttonExecute!!.isdisable = true

       Coroutinescope(dispatchers.Main).launch {
           withContext(dispatchers.IO){
               work()
           }

           buttonExecute!!.isdisable = false
       }
    }

    private suspend fun work() {
       println("corotine starting...")
       delay(5000);
       //springMain.applyChanges()
       println("corotine finished...")
    }
}

所以我添加了协程调用,但出现异常缺少主调度程序的模块。添加提供主调度程序的依赖

看这个异常,我发现你要导入coroutines-android而不是core,所以我把我的pom改成它

        <dependency>
            <groupId>org.jetbrains.kotlinx</groupId>
            <artifactId>kotlinx-coroutines-android</artifactId>
            <version>1.4.2</version>
        </dependency>

导致其他异常ClassNotFoundException: android.os.Looper 现在我很困惑,协程是否打算在android应用程序中使用?我在 Windows 上运行一个 jar。或者我是否需要回到可运行的任务并做一些像在 Swing 中完成的事情?

解决方法

感谢 mipa(评论)的提示。

只需更改 pom 以导入 javafx 而不是 android。

        <dependency>
            <groupId>org.jetbrains.kotlinx</groupId>
            <artifactId>kotlinx-coroutines-javafx</artifactId>
            <version>1.4.2</version>
        </dependency>

简单易行。

目前文档中有 3 个主要导入 https://github.com/Kotlin/kotlinx.coroutines/blob/master/ui/coroutines-guide-ui.md

  • kotlinx-coroutines-android -- Android 应用程序的 Dispatchers.Main 上下文。
  • kotlinx-coroutines-javafx -- JavaFX UI 的 Dispatchers.JavaFx 上下文
  • 应用程序。 kotlinx-coroutines-swing -- Swing UI 应用程序的 Dispatchers.Swing 上下文。

我只需要使用正确的