自 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 请求永远不会重试。必须配置它(通过系统属性)很容易出错。