gpt4 book ai didi

multithreading - Javafx 从线程更新 UI 而无需直接调用 Platform.runLater

转载 作者:行者123 更新时间:2023-12-01 02:13:28 24 4
gpt4 key购买 nike

现在有人说不适合使用Platform.runLater()为了从非 JavaFX 线程和 Oracle 站点更新 UI,引入了一种用于更新进度条的绑定(bind)方法。在这里我想更新一个标签,所以这样编码:

Task task = new Task() {
@Override
protected Object call() throws Exception {
int i = 0;
while (true) {
this.updateMessage("Count " + i);
System.out.println(i);
// Thread.sleep(10);
i++;
}
}
};

Thread t = new Thread(task);
lbStatus.textProperty().bind(task.messageProperty());
t.start();

有用。

我想知道它足够好还是有其他方法可以考虑?
谢谢你。

最佳答案

我不认为说它不“适合”使用 Platform.runLater(...)从后台线程更新 UI。在某些情况下,这样做是正确的,如 Task Javadocs 所示。 .什么javafx.concurrent API 为您在编写多线程 JavaFX 应用程序时通常需要的功能提供了一个“高级”接口(interface)。这个包中的类是由在多线程编程方面具有丰富专业知识的人编写的,因此它们很可能解释了普通程序员可能不知道的细微之处。

例如,虽然 updateMessage 是正确的最终调用 Platform.runLater(...) ,两者并不完全等价。如果你尝试同样的事情,直接调用 Platform.runLater(..) :

// Don't do this! It will make the UI unresponsive:
Task task = new Task() {
@Override
protected Object call() throws Exception {
int i = 0;
while (true) {
Platform.runLater(() -> lblStatus.textProperty().set("Count "+i));
i++;
}
return null ;
}
};
Thread t = new Thread(task);

您的 UI 将变得(至少部分)无响应。原因是你安排了这么多 Runnable在 FX 应用程序线程上,它没有时间做它的常规工作(渲染 UI、响应用户输入等)。 updateMessage(...)的执行精心编写以“限制”对 Platform.runLater(...) 的调用(它基本上将它们限制为每帧渲染一个)。该代码实现起来有点棘手:使用 javafx.concurrent您的代码示例中的 API 意味着您不必自己实现它。

因此,必须始终在 FX 应用程序线程上对 UI 进行更改,而安排这些更改的方法是通过 Platform.runLater(...) .实际上,您要么直接调用它,要么调用最终调用它的代码。但是,一些包装对 Platform.runLater(...) 的调用的 API 方法以非常复杂的方式执行此操作,并且当这些方法提供您需要的功能时,您可能应该更喜欢那些方法而不是自己进行调用。

关于multithreading - Javafx 从线程更新 UI 而无需直接调用 Platform.runLater,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27309642/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com