在HttpURLConnection中停止无提示重试

我使用Android KitKat上的HttpURLConnection将一些数据发布到服务器。 服务器需要很长时间才能响应,并且连接正在静默地重试1到3次,然后才超时。 我不希望它重试,因为服务器作用于所有请求,导致Bad Things(TM)。

我打开连接之前尝试过System.setProperty("http.keepAlive", "false") ,但这并没有帮助。

Solutions Collecting From Web of "在HttpURLConnection中停止无提示重试"

对于POST调用设置

 httpURLConnection.setChunkedStreamingMode(0); 

这应该修复沉默的重试。 错误报告和解决方法可以在这里find。

  • 自己实现一个硬超时,并通过调用disconnect强制closuresHttpURLConnection 。 这可以从您的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 ,以便您可以在isCancelled的asynctask监视中执行一个while循环。 并try..catch所以你可以正确closures所有的stream。

  • 你已经有keepAlive false,并且readTimeout ,也考虑joinconnection timeout too 。 这将设置套接字超时。

你需要设置System.setProperty("sun.net.http.retryPost", "false")

Android的HTTP客户端

在Froyo之前, HttpURLConnection有一些令人沮丧的错误。 特别是,在可读的InputStream上调用close()可能会中毒连接池 。 通过禁用连接池解决此问题:

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