Подтвердить что ты не робот

Android 4.0 org.apache.http.conn.ConnectTimeoutException: подключиться к... приурочен

У меня возникла странная проблема, так как я тестирую свои приложения на 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).

Спасибо за ваши ответы!

4b9b3361

Ответ 1

В приложении Android вы должны избегать выполнения длительных операций в потоке пользовательского интерфейса. Это включает в себя доступ к файлам и сети.

StrictMode позволяет настраивать политики в вашем приложении, чтобы избежать неправильных действий. Начиная с Android 3.0 (Honeycomb) StrictMode настроен на сбой с исключением NetworkOnMainThreadException, если доступ к сети осуществляется в потоке пользовательского интерфейса.

Пока вы должны делать доступ к сети в фоновом потоке.

Если вы настроите Android 3.0 или выше, вы можете отключить эту проверку с помощью следующего кода в начале вашего метода onCreate() вашей деятельности.

StrictMode.ThreadPolicy policy = new StrictMode.
ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy); 

Не рекомендуется отключать это.

Ответ 2

Стек HTTP Apache устарел и сломан в ICS. Хром теперь является стандартом. Убедитесь, что v8 является вашим устройством по умолчанию java script.