Gluon Connect DataProvider.retrieveList 导致 IllegalStateException

Gluon Connect DataProvider.retrieveList results in IllegalStateException

以下代码生成 IllegalStateException - 不在 FX 应用程序线程上 - 。

private void populateListView(){
    GluonObservableList<MyClass> items = DataProvider.retrieveList(restClient.createListDataReader(MyClass.class));
    listview.setItems(items);
}

我想这是因为将 Iterator 中的元素添加到 GluonObservableList 的代码没有包含在 Platform.runLater() 中,尽管 Platform.runLater() 中的其他调用=16=]?

更新 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() 的任何调用