0

我的 Logcat 消息中不断收到连接泄漏警告,即使我已经关闭了我发出的每个请求的每个正文。

我有两个用于 GET 和 POST 请求的包装器方法,它们启动请求并传回响应。

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通过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()postRequest()我调用的方法都跟随着该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取消。所以不能有任何异常阻止它被关闭。

编辑2

阅读这篇文章后,我意识到如果您手动添加“Accept-Encoding...gzip”标头,GZIP 不是透明处理的。删除手动添加确实可以透明地对其进行解码,但是,我在响应正文中只得到了一行文档。

GZIP 透明处理

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

从字面上看,这就是我得到的全部。如果我自己处理解码流,我可以毫无问题地获得整个文档。

这可能是图书馆中的一个错误,我在这里不知所措。

4

0 回答 0