1

次のコードはIllegalStateException- FX アプリケーション以外のスレッド - を生成します。

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

この理由は、要素を から に追加するコードが でラップされていないためだとIterator思います。GluonObservableListPlatform.runLater()retrieveList()

4

1 に答える 1

1

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() への呼び出しをラップすることもできます。

于 2016-08-07T19:15:56.487 に答える