java.net.socketexception:Android中的操作超时问题?

时间:2010-12-17 12:30:39

标签: android

在我的应用程序中,我编写了用于连接到URL的代码,如下所示

InputStream inputStream = new URL(url).openStream();    

我收到了错误。我发送了我的logcat

12-17 15:06:55.065: WARN/System.err(4952): java.net.SocketException: The operation timed out
12-17 15:06:55.065: WARN/System.err(4952):     at org.apache.harmony.luni.platform.OSNetworkSystem.connectStreamWithTimeoutSocketImpl(Native Method)
12-17 15:06:55.065: WARN/System.err(4952):     at org.apache.harmony.luni.platform.OSNetworkSystem.connect(OSNetworkSystem.java:115)
12-17 15:06:55.065: WARN/System.err(4952):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:244)
12-17 15:06:55.075: WARN/System.err(4952):     at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:533)
12-17 15:06:55.075: WARN/System.err(4952):     at java.net.Socket.connect(Socket.java:1055)
12-17 15:06:55.075: WARN/System.err(4952):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:62)
12-17 15:06:55.075: WARN/System.err(4952):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:88)
12-17 15:06:55.075: WARN/System.err(4952):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHTTPConnection(HttpURLConnectionImpl.java:927)
12-17 15:06:55.085: WARN/System.err(4952):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:909)
12-17 15:06:55.085: WARN/System.err(4952):     at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:1152)
12-17 15:06:55.085: WARN/System.err(4952):     at java.net.URL.openStream(URL.java:653)

如何解决这个问题

2 个答案:

答案 0 :(得分:13)

这种情况正在发生,因为有时您的服务器需要很长时间才能响应。实际上,这也可能由于网络速度缓慢而发生,因此您无法完全控制它。如果您使用HttpClient,则可以增加超时时间:

HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(httpParameters, WAIT_RESPONSE_TIMEOUT);
HttpConnectionParams.setTcpNoDelay(httpParameters, true);

client = new DefaultHttpClient(httpParameters);

CONNECTION_TIMEOUT是等待连接建立的时间。 WAIT_RESPONSE_TIMEOUT是等待接收数据的时间 - 在您的情况下,这是您需要增加的数据。

底线:

  • 停止使用网址并立即开始使用HttpClient。
  • 您所描述的情况在生产应用程序中非常常见,您需要满足它。增加超时并不总是有用,因为当网络速度较慢时,您的应用程序似乎会暂停。您可以添加重试机制或通知用户请求失败并请求他再试一次。

答案 1 :(得分:0)

另外,我遇​​到了你传递错误网址的情况,而应用程序正在寻找数据,但从未找到它。检查你的网址,也许你纠正它,以防它出错了,那么请求就不会引起你的错误。