1

我正在为 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()");

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

有任何想法吗?

4

2 回答 2

4

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

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

然后使用参数构造您的 HttpClient:

new DefaultHttpClient(params)

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

还要查看AndroidHttpClient(它设置了合理的超时,以及 gzip 支持等其他内容),并考虑更喜欢 HttpUrlConnection的建议(尽管有一些警告)。

于 2012-10-30T15:43:25.450 回答
0

感谢查理柯林斯,我注意到我没有很好地处理异常。我捕获的异常是 android.os.NetworkOnMainThreadException。这意味着我不能在主线程上执行网络操作(这是针对 3.0+ 的应用程序抛出的)。使用 AsyncTask 对我有用。

于 2012-10-31T14:14:31.550 回答