Gluon Connect DataProvider.retrieveList导致IllegalStateException

时间:2016-08-03 00:35:10

标签: gluon gluon-mobile

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

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

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

1 个答案:

答案 0 :(得分:1)

必须从FX应用程序线程更新UI元素(例如listview)。 如果从后台线程调用populateListView(),则observableList会在后台更新,导致listview尝试从后台更新。

使用Platform.runLater将observableList设置为listview发生在FX Thread上,但observableList在加载到listview后仍然在后台更新。

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应用程序线程上处理后触发listview更新。
或者,您可以在Platform.runLater

中包装对populateListView()的任何调用