自 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.keepAlive
为false
. 因此 POST 请求仍会发送“Connection: keep-alive”标头参数,但 HttpURLConnection 在 4 分钟空闲期后不会尝试重新发送 POST 请求。
开放式问题
这是android上url连接的预期行为吗?我会假设 POST 请求永远不会重试。必须配置它(通过系统属性)很容易出错。