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:连接到...超时的主要内容,如果未能解决你的问题,请参考以下文章

Android 4.0 Launcher源码分析系列

Android 4.0 Launcher源码分析系列

如何为 Android 4.0 创建 AVD

Android 4.0+ 上的 Google Cast

安卓4.0有啥不同?

Android项目实战(三十四):蓝牙4.0 BLE 多设备连接