HttpClient的execute方法持续出现连接超时异常

5
我是一名有用的助手,可以为您翻译文本。以下是需要翻译的内容:

我的应用程序中有一个非常严重的错误,我似乎无法解决。每当我通过以下代码进行REST调用时:

  HttpGet request = new HttpGet(url + getParams());

  HttpParams httpParameters = new BasicHttpParams();
  HttpConnectionParams.setConnectionTimeout(httpParameters, 5000);
  HttpConnectionParams.setSoTimeout(httpParameters, 10000);

  DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);

  httpClient.execute(request);

我在DDMS中得到了错误:

07-15 11:22:47.448: WARN/System.err(973): org.apache.http.conn.ConnectTimeoutException: Connect to (some ip-address) timed out

但有时代码完美运行,我按照应该的方式接收到我的数据。我还通过普通的Web浏览器在我的计算机上测试了REST服务器调用,并且总是在100毫秒内返回我的数据。那么我做错了什么?我也在另一台设备上进行了测试,但遇到了同样的问题。如果有人能解决我的问题,我会非常高兴 :)


这可能与网络慢有关(您正在使用Wi-Fi还是3G?)。尝试在模拟器中运行它。您可能需要增加连接超时时间并设置重试机制。 - kgiannakakis
是的,但是我的其他应用程序可以始终获取所请求的数据。而且我正在使用其中一部手机连接WiFi,但是那部手机也会出现异常。据我所知,httpclient具有自动重试机制? - Martijn538
将超时时间增加到20-30秒。有时候,线路可能会很忙,因此需要超时。 - Andrew Anderson
好的,我将超时时间增加到20秒:HttpConnectionParams.setConnectionTimeout(httpParameters, 20000); HttpConnectionParams.setSoTimeout(httpParameters, 20000);但是我仍然遇到相同的情况,数据很少被加载,大多数情况下都没有接收到任何东西。 - Martijn538
嘿,Martijn538,你解决了超时问题吗? - goodm
4个回答

5
问题在于DefaultHttpClient。您是否正在异步使用它?由于DefaultHttpClient不是线程安全的,在异步环境中使用它可能会导致问题。当我的活动同时启动了多个Http连接时,我曾经遇到过这个问题,并最终将其更改为使用HttpURLConnection。您可以参考此网站:http://www.vogella.de/articles/AndroidNetworking/article.html

1

在我更改了hosts文件后,遇到了完全相同的问题。重新启动手机解决了这个问题。 - Niels

0

我曾经遇到过类似的问题,只有在尝试使用多个设备同时连接时才能重现,解决方法如下:

重新启动实例可解决连接问题。 (或者只需重新启动网络服务)

(c)我的服务器/实例管理员

另外,还有一些人遇到了类似的问题,并且对他们而言一些其他解决方案起到了作用,例如:

  1. 禁用 tcp_timestamp
  2. 禁用 tcp_tw_reuse 和 tcp_tw_recycle
  3. 在 Android 清单文件中启用 vm 保存模式:android:vmSafeMode="true"


0

检查您是否能够使用开发机连接,同时检查加载时间。很有可能您的超时时间太短了。


我将超时时间更改为20秒,问题仍然存在。我还能尝试什么?之前没有人遇到过这个问题吗? - Martijn538
你能访问开发机器的URL视图吗? - Ravi Vyas
是的,但问题在于:有时它加载得很好,及时完成,而有时它似乎根本没有加载! - Martijn538

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接