我認為使用Platform.runLater(…)從背景線程更新UI并不“合适”.有些情況下,這是正确的做法,如
Task Javadocs所示.javafx.concurrent API提供的是一個“更進階”的接口,用于編寫多線程JavaFX應用程式時通常需要的功能.這個包中的類是由具有多線程程式設計專業知識的人編寫的,是以它們很可能已經解釋了普通程式員可能不知道的微妙之處.
作為一個例子,雖然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);
您的使用者界面将變得(至少部分)無響應.原因是你在FX應用程式線程上安排了這麼多Runnables,它沒有時間進行正常工作(渲染UI,響應使用者輸入等). updateMessage(…)的實作是經過精心編寫的,以“限制”對Platform.runLater(…)的調用(它基本上将它們限制為每幀渲染一次).該代碼實作起來有點棘手:在代碼示例中使用javafx.concurrent API意味着您不必自己實作它.
是以,必須始終在FX應用程式線程上對UI進行更改,并且通過Platform.runLater(…)來安排這些更改的方式.實際上,您可以直接調用它,也可以調用最終調用它的代碼.但是,包含對Platform.runLater(…)的調用的一些API方法以非常複雜的方式進行,當這些方法提供您需要的功能時,您應該更喜歡那些自己進行調用的方法.