Platform.runLater слишком медленный в JavaFX - PullRequest
0 голосов
/ 09 декабря 2018

Я пытаюсь выполнить поток внутри моего приложения JavaFx, и мне также необходимо обновить мой просмотр списка, поэтому я использовал внутри него Platform.runLater.Проблема в том, что он кажется слишком медленным, так как он переходит в состояние if внутри него.Часть listView.setItems(model.getEmailList()); выполняется без проблем, но игнорирует условие, даже если при печати двух значений я хочу сравнить их, они разные.Как я могу улучшить это?Потому что я не могу переместить это if за пределы Платформы, так как я пытаюсь отобразить его в потоке моего приложения JavaFX.

new Thread() {
        @Override
        public void run() {
            while (true) {
                try {
                    int currentOnServer = model.askNumbOfEmail();
                    if (emailForClient != currentOnServer) {
                        model.reLoadData();
                        Platform.runLater(() -> {
                            listView.setItems(model.getEmailList());
                            if (currentOnServer > emailForClient) {
                                new Alert(Alert.AlertType.INFORMATION, "Hai recevuto un email!").showAndWait();
                            }
                        });
                        emailForClient = currentOnServer;
                    }
                } catch (IOException ex) {
                    Thread.currentThread().interrupt();
                    return;
                } catch (ParseException ex) {
                    System.out.println("ParseException ERROR!");
                }
            }
        }
    }.start();

1 Ответ

0 голосов
/ 09 декабря 2018

Ваш оператор if не работает, потому что вы изменяете часть условия в отдельном потоке:

emailForClient = currentOnServer

Это распространенная проблема, когда вы работаете спотоки.Вам нужно изменить логику вашего кода, чтобы облегчить параллельное выполнение.Вы можете создать временную переменную для хранения emailForClient и использовать ее вместо Platform.runLater:

model.reLoadData();
final int currentEmail = emailForClient; // I'm assuming emailForClient is an int

Platform.runLater(() -> {
    listView.setItems(model.getEmailList());

    if (currentOnServer > currentEmail) {
        new Alert(Alert.AlertType.INFORMATION, "Hai recevuto un email!").showAndWait();
    }
});

emailForClient = currentOnServer;
...