Сопрограмма JavaFX Kotlin без ОС Android, возможно ли это?

#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.

Мне просто нужно использовать правильный