Mat*_*ola 32 android httpurlconnection
我想知道Android上是否存在HttpUrlConnection和POST请求的已知问题.从Android客户端发出POST请求时,我们遇到间歇性的 EOFExceptions.重试相同的请求最终会起作用.这是一个示例堆栈跟踪:
java.io.EOFException
at libcore.io.Streams.readAsciiLine(Streams.java:203)
at libcore.net.http.HttpEngine.readResponseHeaders(HttpEngine.java:579)
at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:827)
at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:283)
at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:497)
at libcore.net.http.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:134)
Run Code Online (Sandbox Code Playgroud)
有许多类似的错误报告和帖子到堆栈溢出但我无法理解是否确实存在问题,如果是,那么什么版本的Android会受到影响以及建议的修复/解决方法是什么.
以下是我所指的一些类似报告:
这是一个潜在的Android框架修复
我知道在Froyo之前的连接池中存在中毒连接的问题,但这些问题仅在新的ICS +设备上发生.如果以后的设备出现问题,我会期待某种官方Android文档的问题.
Mat*_*ola 12
我们的结论是Android平台存在问题.我们的解决方法是捕获EOFException并重试请求N次.下面是伪代码:
private static final int MAX_RETRIES = 3;
private ResponseType fetchResult(RequestType request) {
return fetchResult(request, 0);
}
private ResponseType fetchResult(RequestType request, int reentryCount) {
try {
// attempt to execute request
} catch (EOFException e) {
if (reentryCount < MAX_RETRIES) {
fetchResult(request, reentryCount + 1);
}
}
// continue processing response
}
Run Code Online (Sandbox Code Playgroud)
HttpURLConnection库在内部维护一个Connections池.因此,每当发送请求时,它首先检查池中是否存在现有连接,基于该连接它决定创建新连接.
这些连接只是套接字,默认情况下此库不会关闭这些套接字.有时可能会发生当前未使用且存在于池中的连接(套接字)不再可用,因为服务器可能会选择在一段时间后终止连接.现在,由于连接即使由服务器关闭,库也不知道它并假设连接/套接字仍然连接.因此它使用这个陈旧的连接发送新请求,因此我们得到EOFException.
处理此问题的最佳方法是在发送每个请求后检查响应标头.服务器始终在终止连接(HTTP 1.1)之前发送"连接:关闭".因此,您可以使用getHeaderField()并检查"连接"字段.另一件需要注意的事情是,服务器ONLY在即将终止连接时发送此连接字段.因此,您需要在正常情况下(当服务器未关闭连接时)获得"null"的可能性进行编码
归档时间: |
|
查看次数: |
16919 次 |
最近记录: |