我的 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
从字面上看,这就是我得到的全部。如果我自己处理解码流,我可以毫无问题地获得整个文档。
这可能是图书馆中的一个错误,我在这里不知所措。