#kotlin #openjfx
#котлин #openjfx
Вопрос:
У меня есть работающий 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...")
}
}
Итак, я добавил вызов сопрограммы, но я получил модуль исключения, в котором отсутствует главный диспетчер. Добавить зависимость, предоставляющую главного диспетчера
Глядя на это исключение, я обнаружил, что вам нужно импортировать сопрограммы-android вместо ядра, поэтому я меняю на него свой pom
<dependency>
<groupId>org.jetbrains.kotlinx</groupId>
<artifactId>kotlinx-coroutines-android</artifactId>
<version>1.4.2</version>
</dependency>
что вызывает другое исключение ClassNotFoundException: android.os.Looper
Теперь я в замешательстве, предназначена ли сопрограмма для использования в приложении для Android? Я запускаю jar в Windows. Или мне нужно вернуться к выполняемой задаче и делать то, что было сделано в swing?
Комментарии:
1. Если вы не работаете на Android, вам не следует использовать зависимость от Android. Может быть, это помогает: github.com/Kotlin/kotlinx.coroutines/blob/master/ui /…
2. mipa, вот и все! Так просто, я только что изменил импорт с kotlinx-coroutines-android на kotlinx-coroutines-javafx спасибо!
Ответ №1:
Спасибо 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-сопрограммы-android — Диспетчеры.Основной контекст для приложений Android.
- контекст kotlinx-coroutines-javafx — Dispatchers.JavaFX для пользовательского интерфейса JavaFX
- приложения. kotlinx-сопрограммы-swing -Диспетчеры.Контекст Swing для приложений Swing UI.
Мне просто нужно использовать правильный