我在 Android KitKat 上使用HttpURLConnection
将一些数据发送到服务器。服务器需要很长时间才能响应,并且连接在超时前静默重试1到3次。我不想让它重试,因为服务器会对所有请求执行操作,从而导致Bad Things(TM)。
我在打开连接之前尝试了System.setProperty("http.keepAlive", "false")
,但这没有用。
答案 0 :(得分:3)
答案 1 :(得分:0)
自行实施硬超时,并强制关闭HttpURLConnection
calling disconnect
。这可以通过Activity
使用android handler
来完成;如果您使用AsyncTask
,则只需拨打cancel
或Thread.interrupt()
:
new Handler().postDelayed(new Runnable() {
public void run() {
httpUrlConnTask.cancel(true);
}
}, timeout * 1000);
在httpUrlConnTask
中,请致电disconnect
:
if (isCancelled()) {
urlConnection.disconnect();
return;
}
您可能必须在另一个内部子线程中执行urlConnection
,因此您可以在while
的asynctask监视中执行isCancelled
循环。并try..catch
,以便您可以正确关闭所有流。
您已经keepAlive
为false,readTimeout
,请考虑添加connection timeout too
。这将设置套接字超时。
答案 2 :(得分:-1)
您需要设置System.setProperty("sun.net.http.retryPost", "false")
答案 3 :(得分:-4)
在Froyo之前,HttpURLConnection
有一些令人沮丧的错误。特别是,在可读的InputStream上调用close()可以poison the connection pool。通过禁用连接池来解决此问题:
private void disableConnectionReuseIfNecessary() {
// HTTP connection reuse which was buggy pre-froyo
if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {
System.setProperty("http.keepAlive", "false");
}
}