UI 要素 (リストビューなど) の更新は、FX アプリケーション スレッドから行う必要があります。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() への呼び出しをラップすることもできます。