JavaFX在执行计划的长计算时冻结GUI

时间:2018-04-27 23:44:28

标签: java user-interface javafx

我正在制作一个桌面应用程序,它将计算机文件与数据库同步。它每5秒安排一次,检查是否有互联网连接 我正在使用TimeLine进行计划和服务(任务)来重复此任务:

我的日程安排:

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();
    }

}

但是只要需要更新,它就会开始冻结我的GUI。 有什么办法可以避免吗? 提前谢谢。

0 个答案:

没有答案