Platform.runLater 在 JavaFX 中太慢
Platform.runLater too slow in JavaFX
我正在尝试在我的 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();
您的 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;
我正在尝试在我的 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();
您的 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;