HttpURLC соединение с POST "тайм-аут" на ICS, работает в HC - PullRequest
4 голосов
/ 08 февраля 2012

Приложение Android на планшете не работает с ICS из-за проблемы со входом в систему.Когда я посмотрел свой код и запустил его в режиме отладки на планшете ICS, я увидел проблему, но не понимаю ее.Код работает правильно на всех моделях Honeycomb, которые я тестировал, и на самом деле у меня есть два планшета, подключенных к моему компьютеру (один Samsung Galaxy Tab с версией 3.2 и Motorola Xoom wifi с версией 4.0.3), и код не работает на ICS и работаетна HC.

Ошибка - исключение времени ожидания гнезда.Время ожидания составляло 2000 мс, но я увеличил его до 100000 мс для тестирования, и оно не оказало никакого влияния.

Используя браузер на планшете ICS, я могу перейти по URL-адресу, и он отвечает, поэтому он не отображаетсябыть связанным с сетью.

Я работаю в фоновом потоке, используя AsyncTask.

Slurp просто берет все входные данные из InputStream, а использование StringBuilder создает строковое представление.На самом деле это бесполезно в этом запросе, но я добавил его, чтобы увидеть, что сервер отвечает.

Я размещаю на странице так же, как пользователь аутентифицируется с помощью формы, поэтому я использую x-www-form-urlencoded.

Опять же, этот код прекрасно работает на Honeycomb, но не работает на ICS.

Код устанавливает соединение, но не работает, когда запрашивает ответ от сервера, почти каксервер все еще чего-то ждет ... в любом случае вот код:

static public String authenticate(String service_url, String username, String password) throws IOException {
    if (username == null || password == null)
        throw new IOException();

    String charset = "UTF-8";
    String query = String.format("Email=%s&Password=%s",URLEncoder.encode(username, charset),URLEncoder.encode(password, charset));
    byte [] data = query.getBytes(charset);

    URL url = new URL(service_url);
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    connection.setRequestProperty("Accept-Charset", charset);
    connection.setRequestProperty("Content-Length", Integer.toString(data.length));

    connection.setDoOutput(true);

    connection.setRequestMethod("POST");
    connection.setReadTimeout(5000); // 2 second timeout.


    try {
        connection.connect();

        DataOutputStream pw = new DataOutputStream (connection.getOutputStream());
        pw.writeBytes(query);
        pw.flush();
        pw.close();

        int code = connection.getResponseCode(); //SOCKET TIMEOUT HERE
        if (code == 200 || code == 302)
        {
            InputStream is = connection.getInputStream();
            String value = slurp(is);

            List<String> cookies = connection.getHeaderFields().get("Set-Cookie");
            if (cookies == null)
                throw new IOException();

            for (String cookie : cookies) {
                if (cookie.startsWith("cpms")) {
                    cookieTime = new DateTime();  //crazy but the expires time in the cookie is not actually accurate.
                    return cookie; // this is the only correct path out.
                }
            }
        }
        else
            Logger.e(StaticUtils.class, "Invalid response code while logging in: " + code);
    }
    catch (IOException ioe)
    {
        Logger.e(StaticUtils.class, ioe);
        throw ioe; // log it and then throw it back.        
    } finally {
           connection.disconnect();
    }
    return null;
}
...