没有 android OS 的 JavaFX + Kotlin 协程,可能吗?
JavaFX + Kotlin coroutine without android OS, is it possible?
我有一个可运行的 jar,它有一个用 javafx fxml 制作的 UI 和用 spring jpa 完成的一些数据库操作的 kotlin 中的 class 代码。
一切都很好,除了我不想在工作时阻塞主线程。来自 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 而不是核心,所以我将 pom 更改为它
<dependency>
<groupId>org.jetbrains.kotlinx</groupId>
<artifactId>kotlinx-coroutines-android</artifactId>
<version>1.4.2</version>
</dependency>
导致其他异常 ClassNotFoundException: android.os.Looper
现在我很困惑,协程是否打算在 android 应用程序中使用?我是 运行 windows 上的一个罐子。或者我是否需要返回可运行任务并像在 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 -- Dispatchers.Main Android 应用程序的上下文。
- kotlinx-coroutines-javafx -- Dispatchers.JavaFx JavaFX 上下文 UI
- 应用程序。
kotlinx-coroutines-swing -- Dispatchers.Swing Swing UI 应用程序的上下文。
我只要用对了
我有一个可运行的 jar,它有一个用 javafx fxml 制作的 UI 和用 spring jpa 完成的一些数据库操作的 kotlin 中的 class 代码。
一切都很好,除了我不想在工作时阻塞主线程。来自 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 而不是核心,所以我将 pom 更改为它
<dependency>
<groupId>org.jetbrains.kotlinx</groupId>
<artifactId>kotlinx-coroutines-android</artifactId>
<version>1.4.2</version>
</dependency>
导致其他异常 ClassNotFoundException: android.os.Looper 现在我很困惑,协程是否打算在 android 应用程序中使用?我是 运行 windows 上的一个罐子。或者我是否需要返回可运行任务并像在 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 -- Dispatchers.Main Android 应用程序的上下文。
- kotlinx-coroutines-javafx -- Dispatchers.JavaFx JavaFX 上下文 UI
- 应用程序。 kotlinx-coroutines-swing -- Dispatchers.Swing Swing UI 应用程序的上下文。
我只要用对了