在HttpURLConnection中停止静默重试

时间:2014-06-25 20:20:06

标签: android httpurlconnection

我在 Android KitKat 上使用HttpURLConnection将一些数据发送到服务器。服务器需要很长时间才能响应,并且连接在超时前静默重试1到3次。我不想让它重试,因为服务器会对所有请求执行操作,从而导致Bad Things(TM)。

我在打开连接之前尝试了System.setProperty("http.keepAlive", "false"),但这没有用。

4 个答案:

答案 0 :(得分:3)

对于POST来电设置

httpURLConnection.setChunkedStreamingMode(0);

这应该修复静默重试。 可以找到错误报告和解决方法here

答案 1 :(得分:0)

  • 自行实施硬超时,并强制关闭HttpURLConnection calling disconnect。这可以通过Activity使用android handler来完成;如果您使用AsyncTask,则只需拨打cancelThread.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)

Android’s HTTP Clients

在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");
    }
}