JavaFX时间轴:按下按钮后应用程序冻结一段时间

时间:2013-12-19 11:57:19

标签: java concurrency javafx

我有一个激活与服务器通信的按钮。每分钟都会从远程服务器获取一些数据。但是当我点击按钮时,即使我使用时间轴,我的应用也会冻结几秒钟。

private Timeline timer;

@Override
public void handle(ActionEvent actionEvent) {
    //Data initialization like read textfields' content

    view.getConnectButton().setText("Reconnect");

    setCounters();

    if(timer != null) {
        timer.stop();
    }
    initTimer();
    timer.play();
}

private void setCounters() {
    String dataFromServer = model.getCybergameViwers(); //Retrieve data from server
    //make something with received data
}

/**
 * Updates counters every 60 seconds
 */
private void initTimer() {
    timer = new Timeline(new KeyFrame(Duration.seconds(60), new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent actionEvent) {
            setCounters();
        }
    }));
    timer.setCycleCount(Animation.INDEFINITE);
}

据此,计时器在后台运行,每分钟向服务器发送一次请求。但在按下第一个按钮后,app会冻结。我怀疑setCounters()中有handle(),但没有它,字段初始化将在60秒内完成。

如何在按下第一个按钮时修复应用冻结?

2 个答案:

答案 0 :(得分:0)

您的服务器调用位于JavaFX应用程序线程中而不是后台线程中,它只是在应用程序线程内的定期调用。

当调用setCounters()时,您的服务器正在处理请求,因此如果需要时间,它会锁定您的UI。

如果你想在后台线程中定期执行一个可能在应用程序线程中有回调的任务,你应该查看随JavaFX 8提供的ScheduledService,如果你想留在JavaFX 2上你可以在你的代码中实现它的实现太

有一个类似于你的问题:Periodically refresh data

答案 1 :(得分:0)

等到响应来了。使用单独的线程来调用此函数,您将不会遇到此问题