4

私はGWTでサーブレットをコーディングしていますが、関数でグローバルとして宣言されたデータ変数で何が起こっているのかよくわかりません。多分それは動的関数宣言への変数の使用に関連するより一般的なJavaの問題ですが、私はこれに対する答えを見つけることができません。

これは私のコードです:

private AbstractDataTable fetchDataFromServer() {

    final DataTable data = DataTable.create();
    System.out.println("1 Table has " + data.getNumberOfColumns() + " columns");
    System.out.println("1 Table has " + data.getNumberOfRows() + " rows");

    try {

        RequestBuilder rb = new RequestBuilder(RequestBuilder.GET, "/mongo.json");

        rb.setCallback(new RequestCallback() {
            @Override
            public void onResponseReceived(Request request, Response response) {
                JSONValue value = JSONParser.parse(response.getText());
                JSONObject productsObj = value.isObject();          
                JSONArray radiation = productsObj.get("ShortWave_Rad").isArray();

                if (radiation != null) {

                    data.addColumn(ColumnType.NUMBER, "Horizon");
                    data.addColumn(ColumnType.NUMBER, "Value");

                    System.out.println("Values " + radiation.size());

                    for (int i=0; i<=radiation.size()-1; i++) {

                        JSONObject productObj = radiation.get(i).isObject();
                        data.addRows(radiation.size());
                        data.setValue(i, 0, productObj.get("horizon").isNumber().doubleValue());
                        data.setValue(i, 1, productObj.get("value").isNumber().doubleValue());      
                    }

                    System.out.println("2 Table has " + data.getNumberOfColumns() + " columns");
                    System.out.println("2 Table has " + data.getNumberOfRows() + " rows");      

                }
            }
            @Override
            public void onError(Request request, Throwable exception) {
                Window.alert("Error occurred" + exception.getMessage());
            }
        });
        rb.send();

    } 
    catch (RequestException e) {
        Window.alert("Error occurred" + e.getMessage());
    }

    System.out.println("3 Table has " + data.getNumberOfColumns() + " columns");
    System.out.println("3 Table has " + data.getNumberOfRows() + " rows");

    return data;
}

そして、これは私が得る出力です:

1テーブルには0列があります

1テーブルには0行があります

2テーブルには2つの列があります

2テーブルには10行あります

3テーブルには0個の列があります

3テーブルには0行があります

onResponseReceived宣言で使用された後、データの内容はどこに行きましたか?

助けてくれて本当にありがとうございます。

4

1 に答える 1

2

Yourは、非同期呼び出し応答onResponseReceivedの後に呼び出されます。以下のステートメントは、応答を受信する前に実行される可能性が非常に高いです。

System.out.println("3Table has colums " + data.getNumberOfColumns());
System.out.println("3Table has rows " + data.getNumberOfRows());

最後にサイズを出力する前に、いくつかのステータスフラグを使用してコールバックのステータスを確認します。

于 2012-11-15T04:08:32.140 に答える