必须从 FX 应用程序线程更新 UI 元素(例如列表视图)。如果从后台线程调用 populateListView(),observableList 在后台更新,导致列表视图尝试从后台更新。
使用 Platform.runLater 将 observableList 设置为列表视图发生在 FX 线程上,但 observableList 在加载到列表视图后仍会在后台更新。
new Thread(()->{
GluonObservableList<MyClass> items = DataProvider.retrieveList(restClient.createListDataReader(MyClass.class));
//Option 1
//listview.setItems(items);
//Option 2
//Platform.runLater(()->listview.setItems(items));
//Option 3
//items.initializedProperty().addListener((obv,ov,nv)->{
// listview.setItems(items);
//});
//Option 4
items.stateProperty().addListener((obvs,ovs,nvs)->{
if (nvs.equals(ConnectState.SUCCEEDED)) {
listview.setItems(items);
}else if(nvs.equals(ConnectState.FAILED)){
MobileApplication.getInstance().showMessage("Rest API request failed");
}
});
}).start();
选项 1 和选项 2 在数据加载到 observableList 之前更新列表视图。选项 1 和 2 抛出多个异常(选项 1 很丑)。
选项 3 和选项 4 在加载 observableList 并在 FX 应用程序线程上处理后触发列表视图更新。
或者,您可以在 Platform.runLater 中包装对 populateListView() 的任何调用