JavaFX останавливает графический интерфейс при выполнении запланированных длинных вычислений - PullRequest
0 голосов
/ 28 апреля 2018

Я создаю настольное приложение, которое синхронизирует файл компьютера с базой данных. Планируется каждые 5 секунд, чтобы проверить, есть ли подключение к интернету Я использую TimeLine для расписания и Service (Task) для повторения этой задачи:

Мой график:

public void sync() {
    SyncTask syncTask = new SyncTask(bar);
    Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(5), 
        e -> {
            if (needSync() && syncTask.isDone()) {
                syncTask.bind();
                syncTask.start(); 
            }
    }));
    timeline.setCycleCount(Animation.INDEFINITE);
    timeline.play();
}

Мой класс SyncTask:

private class SyncTask {
    private ProgressBar bar;
    public SyncTask(ProgressBar bar) {
        this.bar = bar;
    }
    Service<Boolean> service = new Service<Boolean>() {
        @Override
        protected Task<Boolean> createTask() {
            return new Task<Boolean>() {
                @Override
                public Boolean call() {
                    return syncSomethingHere();
                }
            };
        }
    };

    public void bind() {
        bar.progressProperty().bind(service.progressProperty());
        bar.setVisible(true);
        service.setOnSucceeded(ev -> {
            bar.setVisible(false);
        });
    }

    public void start() {
        service.restart();
    }

    public boolean isDone() {
        return !service.isRunning();
    }

}

Но он начинает зависать в моем графическом интерфейсе всякий раз, когда ему нужно обновить. Есть ли способ, которым я могу избежать этого? Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...