8

これは、OkHttp の Async Get を使用した私の OkHttp ポスト フォーム パラメータ メソッドです。

public Call postGetCountries(Callback callback) {
    RequestBody body = new FormEncodingBuilder()
        .add("op", "op")
        .build();

    Log.d(TAG_PARAMS, "op=sgetcountrylist, app_type=1");

    Request request = new Request.Builder()
        .url(GATEWAY_URL)
        .post(body)
        .build();

    Call call = CLIENT.newCall(request);
    call.enqueue(callback);

    return call;
}

これは私のカスタム コールバックです。

private class GetCountriesCallback implements Callback {
    @Override
    public void onFailure(Request request, IOException e) {
        Log.e("OkHttp", e.getMessage());
    }

    @Override
    public void onResponse(Response response) throws IOException {
        Log.d("PASSED", "PASS");
        Log.d(Connection.TAG_RETURN, response.body().string());

        try {
            InputStream is = response.body().byteStream();
            List test = connectionParser.parse(is, "op");

        } catch (XmlPullParserException e) {
            Log.e("PARSE ERROR", e.getMessage());
        }
    }
}

これは私のインスタンス化された解析メソッドです。

public List parse(InputStream in, String op) throws XmlPullParserException, IOException {
    try {
        XmlPullParser parser = Xml.newPullParser();
        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
        parser.setInput(in, null);
        parser.nextTag();
        return readFeed(parser, op);
    } finally {
        in.close();
    }
}

残念ながら動作するかどうかを現在テストしています

10-06 11:54:42.492 6336-6892/ D/PASSED: PASS
10-06 11:54:42.692 6336-6892/ E/PARSE ERROR: Invalid stream or encoding: java.io.IOException: closed (position:START_DOCUMENT null@1:1) caused by: java.io.IOException: closed

これは、プロセス全体を開始するために、アクティビティの onCreate で使用するものです。

private Connection connect = Connection.getInstance();
connect.postGetCountries(new GetCountriesCallback());

InputStream が閉じられる理由がわかりません。

4

1 に答える 1

7

2 つのことが起こっている可能性があります。まず、本文は 1 回しか読み取れません。複数回読みたい場合は、結果をどこかに保存する必要があります。ここで 1 回、本文を 2 回読んでいます。

Log.d(Connection.TAG_RETURN, response.body().string());

そしてここで--

InputStream is = response.body().byteStream();
List test = connectionParser.parse(is, "op");

解析を開始するまでに、ストリームで利用可能な入力を使い果たしています。簡単な解決策は、ログ ステートメントを削除することです。

つまずく可能性がある、または将来つまずく可能性があるもう 1 つのことはonResponse、HTTP がエラー コードを返す場合でも呼び出されることです。またはメソッドをチェックして、応答Responseの解析を試みる必要があるかどうかを判断する必要があります。code()isSuccesful()

于 2015-10-06T04:39:59.747 に答える