0

送信するすべてのリクエストの本文をすべて閉じたにもかかわらず、Logcat メッセージに接続リークの警告が表示され続けます。

GET および POST リクエスト用の 2 つのラッパー メソッドがあり、リクエストを開始してレスポンスを返します。

protected Response getRequest(String url, OkHttpClient client) throws IOException, SMUserLoggedOutException {
    // Create the builder.
    Request.Builder getRequestBuilder = new Request.Builder();

    // Set URL.
    getRequestBuilder.url(url);

    // Set Headers.
    setHeaders(getRequestBuilder, REQUEST_TYPE_GET);

    // Build the request.
    Request getRequest = getRequestBuilder.build();

    // Fire
    Response getResponse = client.newCall(getRequest).execute();

    // Check for logout.
    if (checkForLogout(getResponse) && !mIgnoreLoggedOutExceptions) {
        // Close body.
        getResponse.body().close();

        // Throw logged out exception.
        throw new SMUserLoggedOutException("User logged out");
    }

    // Return the response.
    return getResponse;
}

protected Response postRequest(String url, RequestBody formBody, OkHttpClient client) throws IOException, SMUserLoggedOutException {
    // Create the builder.
    Request.Builder postRequestBuilder = new Request.Builder();

    // Set URL.
    postRequestBuilder.url(url);

    // Set Headers.
    setHeaders(postRequestBuilder, REQUEST_TYPE_POST);

    // Set POST body.
    postRequestBuilder.post(formBody);

    // Build the request.
    Request postRequest = postRequestBuilder.build();

    // Fire.
    Response postResponse = client.newCall(postRequest).execute();

    // Check for logout.
    if (checkForLogout(postResponse) && !mIgnoreLoggedOutExceptions) {
        // Close response body.
        postResponse.body().close();

        // Throw logged out exception.
        throw new SMUserLoggedOutException("User logged out");
    }

    // Return the response.
    return postResponse;
}

InputStream私は、そのように応答を介して読み取ることにより、応答本文を文字列に変換することを処理する3番目の方法を持っていますbody().byteStream()

protected String getResponseBodyAsString(Response response) throws IOException {
    // Reference the input stream.
    InputStream inputStream;

    String contentEncodingHeader = response.header(HEADER_CONTENT_ENCODING);
    if (contentEncodingHeader != null && contentEncodingHeader.equals(STRING_GZIP)) {
        // Read the zipped contents.
        inputStream = new GZIPInputStream(response.body().byteStream());
    } else {
        // Read the normal contents.
        inputStream = response.body().byteStream();
    }

    // Create and return buffered reader.
    BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));

    // Read stream.
    StringBuilder sb = new StringBuilder("");
    String line;
    while ((line = br.readLine()) != null) {
        sb.append(line.trim());
    }

    // Close everything.
    response.body().close();

    // I realize this isn't needed, but I kept getting warnings so
    // I figured, what the hell.
    inputStream.close(); 
    br.close();

    // Return the string.
    return sb.toString();
}

すべてのgetRequest()or postRequest()I 呼び出しの後にgetResponseBodyAsString()メソッドが続き、ユーザーがリクエスト間でログアウトすると、本体も閉じられます。それでも、接続リークの警告が表示されます..

他のコードが必要な場合は、お気軽にお問い合わせください。

ありがとうございます。

編集

コードの別のブロックが役立つかどうかはわかりません。例外をキャッチ するオブジェクトを呼び出すgetRequest()か、オブジェクトにpostRequest()カプセル化されるすべてのオブジェクト。ASyncTask

try {
    // Execute the main task.
    success = mTransferObjectBase.run();
} catch (Exception e) {
    // Save exception.
    mException = e;

    // Cancel the task.
    cancel(true);
}

現在、body()これらの応答を閉じるものは何もありませんが、リーク警告が表示された場合、ASyncTaskキャンセルされることはありません。そのため、閉じるのを妨げている例外はありません。

EDIT2

この投稿を読んだ後、"Accept-Encoding...gzip" ヘッダーを手動で追加すると、GZIP が透過的に処理されないことに気付きました。手動の追加を削除すると、透過的にデコードできますが、応答本文でドキュメントの 1 行しか取得できません。

透過的に処理される GZIP

<td align="center"><img width="208" height="110" src="images/alert_loginlogo.gif" /></td

文字通り、それが私が返すすべてです。自分でストリームのデコードを処理すると、問題なくドキュメント全体を取得できます。

これはライブラリのバグでしょうか。ここで途方に暮れています。

4

0 に答える 0