Android 4.0 org.apache.http.conn.ConnectTimeoutException:连接到...超时
Posted
技术标签:
【中文标题】Android 4.0 org.apache.http.conn.ConnectTimeoutException:连接到...超时【英文标题】:Android 4.0 org.apache.http.conn.ConnectTimeoutException: Connect to ... timed out 【发布时间】:2012-02-28 05:28:17 【问题描述】:自从我在 ICS 上测试我的应用程序后,我遇到了一个奇怪的问题。
在 android 2.X 上使用以下代码效果很好(有时会发生超时但很少发生):
HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, CONNECTION_TIMEOUT);
HttpConnectionParams.setSoTimeout(httpParameters, SOCKET_TIMEOUT);
final DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
// Create a new HttpClient and Post Header
HttpPost httpPost = new HttpPost(url);
HttpResponse response = null;
try
if (keys != null)
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF_8));
// Cookies
// Create a local instance of cookie store
if (checkCookieValues())
BasicClientCookie cookieSession = new BasicClientCookie(mCookieName, mCookieValue);
cookieSession.setDomain(mCookieDomain);
httpClient.getCookieStore().clear();
httpClient.getCookieStore().addCookie(cookieSession);
// Execute HTTP Post Request
response = httpClient.execute(httpPost);
httpClient.getConnectionManager().shutdown();
catch (UnknownHostException e)
Log.e(TAG, "Error when calling postData", e);
catch (SocketTimeoutException e)
Log.e(TAG, "Error when calling postData", e);
catch (ClientProtocolException e)
Log.e(TAG, "Error when calling postData", e);
catch (SocketException e)
Log.e(TAG, "Error when calling postData", e);
catch (IOException e)
Log.e(TAG, "Error when calling postData", e);
return response;
在 ICS 上,一旦我收到超时异常,接下来的所有调用都会返回超时异常。
Timeout exception received :
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): org.apache.http.conn.ConnectTimeoutException: Connect to /78.109.91.193:80 timed out
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:121)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at com.kreactive.planningtv.service.PlanningTVService.postData(PlanningTVService.java:1554)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at com.kreactive.planningtv.service.PlanningTVService.fbConnect(PlanningTVService.java:1897)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at com.kreactive.planningtv.service.PlanningTVService.onHandleIntent(PlanningTVService.java:569)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at android.os.Handler.dispatchMessage(Handler.java:99)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at android.os.Looper.loop(Looper.java:137)
02-06 19:06:05.425: E/PLTV:PlanningTVService(2980): at android.os.HandlerThread.run(HandlerThread.java:60)
有人遇到过这个问题吗?有没有办法避免这个问题? 我查了一下,没有找到类似的问题(尤其是 ICS)。
感谢您的回复!
【问题讨论】:
你能得到任何解决方案吗 你是否在一个独特的线程中运行了这段代码? 我在后台线程上有类似的代码,并且在将目标更改为 4.X 时注意到同样的问题。 ConnectTimeoutExceptions 是随机抛出的,但经常发生。以 2.X 为目标时,这不是问题 【参考方案1】:Apache http 堆栈在 ICS 中已被弃用和损坏。铬现在是标准。确保 v8 是您设备的默认 Java 脚本引擎。
【讨论】:
我认为这无关。检查上面的类似内容以获得我们将很快测试的可能答案。无论如何,谢谢你的回答。【参考方案2】:在 Android 应用程序中,您应该避免在用户界面线程上执行长时间运行的操作。这包括文件和网络访问。
StrictMode 允许在您的应用程序中设置策略以避免做不正确的事情。从 Android 3.0 (Honeycomb) 开始,StrictMode 配置为在用户界面线程中访问网络时崩溃并引发 NetworkOnMainThreadException 异常。
虽然您应该在后台线程中进行网络访问。
如果您的目标是 Android 3.0 或更高版本,您可以通过以下代码在您的活动的 onCreate() 方法的开头关闭此检查。
StrictMode.ThreadPolicy policy = new StrictMode.
ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
不建议关闭此功能。
【讨论】:
谁投了票,请在此说明原因。以上是关于Android 4.0 org.apache.http.conn.ConnectTimeoutException:连接到...超时的主要内容,如果未能解决你的问题,请参考以下文章