4

自 Android 4.0 以来,使用 HttpURLConnection 是 http 请求的首选方式。

问题

在发送 POST 请求时,我们的效果是,在大约 4 分钟的空闲时间之后,请求被发送了两次。

以下代码段重现了该问题:

公共类 MainActivity 扩展 Activity {

  @覆盖
  受保护的无效onCreate(捆绑保存实例状态){
    super.onCreate( 保存实例状态 );
    按钮按钮 = 新按钮(此);
    button.setText("执行 POST 请求");
    button.setOnClickListener(新的 OnClickListener(){

      @覆盖
      公共无效 onClick(查看 v){

        新线程(新可运行(){

          @覆盖
          公共无效运行(){
            makePostRequest();
          }

        } )。开始();
      }
    });
    设置内容视图(按钮);
  }

  私人无效 makePostRequest() {
    尝试 {
      字符串目标 = "http://server.com/path";
      System.out.println("发送 POST 请求:" + target );
      URL url = 新 URL(目标);
      HttpURLConnection conn = ( HttpURLConnection )url.openConnection();
      conn.setDoOutput(真);
      System.out.println("响应:" + conn.getResponseCode());
    } 捕捉(异常 e){
      e.printStackTrace();
    }
  }
}

重现:点击按钮。等四分钟。再次按下按钮。第二个按钮点击的 POST 请求被发送到服务器两次。

这个问题似乎只出现在 Android 4.1 及更高版本上。无法在 4.0 上重现它。

解决方案

解决了我们将系统属性设置http.keepAlivefalse. 因此 POST 请求仍会发送“Connection: keep-alive”标头参数,但 HttpURLConnection 在 4 分钟空闲期后不会尝试重新发送 POST 请求。

开放式问题

这是android上url连接的预期行为吗?我会假设 POST 请求永远不会重试。必须配置它(通过系统属性)很容易出错。

4

0 回答 0