在HttpURLConnection中停止无提示重试

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

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

  • 将cookies从HttpURLConnection(java.net.CookieManager)传递给WebView(android.webkit.CookieManager)
  • 使用HttpURLConnection发送UTF-8string
  • Android上的HttpURLConnection失败
  • Android下载二进制文件的问题
  • HttpURLConnection:java.lang.IllegalStateException:已连接
  • 在jellybean的NetworkOnMainThreadException错误
  • HttpUrlConnection.openConnection第二次失败
  • 如何在没有使用android中的try / catch处理它的情况下获得401响应
  • 对于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"); } }