Android 4.0及更高版本的httpclient.execute(httppost)问题

时间:2012-10-30 14:29:58

标签: android httpclient

我正在为Android编写应用程序。应用程序连接到服务器以检索注释。 感兴趣的代码是:

BufferedReader input = null;
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://www.domain.com/personal_proj/directorydirectory/file.php");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
Log.i("TEST","after httpclient.execute()");
HttpEntity entity = response.getEntity();

我在HTC Wildfire,HTC Desire Z中测试了这段代码并且它可以工作。如果此代码在Android 4.0+中执行,则它永远不会到达

Log.i("TEST","after httpclient.execute()");

,服务器永远不会收到请求,它永远不会抛出异常。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

我不确定no arg构造的DefaultHttpClient的默认连接和套接字超时参数是什么,但我会检查,或设置参数:

HttpParams params = new BasicHttpParams(); HttpConnectionParams.setConnectionTimeout(params, 15000); HttpConnectionParams.setSoTimeout(params, 20000);

然后用params构建你的HttpClient:

new DefaultHttpClient(params)

此时,如果没有其他响应,您至少应该获得超时。

另请参阅AndroidHttpClient(它设置合理的超时,以及gzip支持等),并考虑对prefer HttpUrlConnection的建议(尽管有一些警告)。

答案 1 :(得分:0)

感谢Charlie Collins,我注意到我没有处理好异常。我捕获它的例外是android.os.NetworkOnMainThreadException。这意味着我无法在主线程上执行网络操作(这适用于针对3.0+的应用程序)。使用AsyncTask为我工作。