自Android 4.0以来,使用HttpURLConnection是http请求的首选方式。
问题
发送POST请求时,我们有效,请求在大约4分钟的空闲时间后发送两次。
以下代码段会重现此问题:
public class MainActivity extends Activity { @Override protected void onCreate( Bundle savedInstanceState ) { super.onCreate( savedInstanceState ); Button button = new Button( this ); button.setText( "Perform POST request" ); button.setOnClickListener( new OnClickListener() { @Override public void onClick( View v ) { new Thread( new Runnable() { @Override public void run() { makePostRequest(); } } ).start(); } } ); setContentView( button ); } private void makePostRequest() { try { String target = "http://server.com/path"; System.out.println( "Sending POST request: " + target ); URL url = new URL( target ); HttpURLConnection conn = ( HttpURLConnection )url.openConnection(); conn.setDoOutput( true ); System.out.println( "Response: " + conn.getResponseCode() ); } catch( Exception e ) { e.printStackTrace(); } } }
重现:按下按钮。等四分钟。再次按下按钮。第二个按钮点击的POST请求被发送到服务器两次。
这个问题似乎只出现在Android 4.1及更高版本上。无法在4.0上重现它。
解决方案
解决了我们将系统属性http.keepAlive
设置为false
的问题。因此,POST请求仍然发送“Connection:keep-alive”头参数,但HttpURLConnection在4分钟空闲时间后不会尝试重新发送POST请求。
打开问题
这是Android上url连接的预期行为吗?我认为永远不会重试POST请求。必须配置它(通过系统属性)非常容易出错。