我想知道 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)
有许多类似的错误报告和堆栈溢出的帖子,但我无法理解是否真的存在问题,如果是的话,哪些版本的 Android 受到影响以及建议的修复/解决方法是什么。
以下是我参考的一些类似报告:
- Android HttpsUrlConnection eofException https://stackoverflow.com/questions/15411213/android-httpsurlconnection-eofexception
- Android HttpURLConnection 抛出 EOFException https://stackoverflow.com/questions/12319194/android-httpurlconnection-throwing-eofexception
- HttpURLConnection getInputStream() 中的 EOFException 和 FileNotFoundException https://stackoverflow.com/questions/17967731/eofexception-and-filenotfoundexception-in-httpurlconnection-getinputstream
- https://code.google.com/p/google-http-java-client/issues/detail?id=213 https://code.google.com/p/google-http-java-client/issues/detail?id=213
- https://code.google.com/p/android/issues/detail?id=29509 https://code.google.com/p/android/issues/detail?id=29509
- https://code.google.com/p/google-http-java-client/issues/detail?id=230 https://code.google.com/p/google-http-java-client/issues/detail?id=230
- https://code.google.com/p/android/issues/detail?id=41576 https://code.google.com/p/android/issues/detail?id=41576
这是一个潜在的 Android 框架修复
- https://android.googlesource.com/platform/libcore/+/19aa40c81c48ff98ccc7272f2a3c41479b806376 https://android.googlesource.com/platform/libcore/+/19aa40c81c48ff98ccc7272f2a3c41479b806376
我确实知道 Froyo 之前的连接池中存在中毒连接问题,但这些问题仅发生在新的 ICS+ 设备上。如果后来的设备出现问题,我会期待某种关于该问题的官方 Android 文档。
我们的结论是 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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)