Строка, которая пришла, когда http ответ отключен?- Java, платформа Android 3.0 - PullRequest
2 голосов
/ 05 июля 2011

Я столкнулся с очень странной проблемой, и у меня нет ни малейшего представления, с чего начать.

Я отправляю http-запрос на сервер и получаю простую строку в ответ.Это отлично работало в моем приложении для смартфона;это даже отлично работает в моем браузере.Однако, хотя я думал, что просто скопирую и вставлю код смартфона, он больше не работает для моей версии приложения для планшета (Android 3.0.1).

Я проверил с помощью отладчика, и старая версия получает строку длиной 2958 символов.Однако новая версия получает только строку длиной 1334.Я зарегистрировал URL новой версии, вставил его в свой браузер и снова получил строку из 2985 символов.

Я действительно не могу найти каких-либо существенных различий в своем коде (см. Ниже).Кроме того, я не могу поверить, что было какое-то изменение в Android, которое ограничило бы длину строки ?!

Так у кого-нибудь есть идея?


Оригинальный код смартфона:

if (CheckInternet())
{
    myURL = new URL(params[0]);

    httpClient = AndroidHttpClient.newInstance("android");

    if (rtype == RequestType.GET)
    {
        httpRequest = new HttpGet(myURL.toExternalForm());
    }
    else
    {
        httpRequest = new HttpPost(myURL.toExternalForm());

        HttpEntity myEntity = new StringEntity(message, "UTF-8");
        ((HttpPost) httpRequest).setEntity(myEntity);
    }


    HttpParams httpParams = new BasicHttpParams();
    HttpProtocolParams.setHttpElementCharset(httpParams, "UTF-8");
    HttpProtocolParams.setContentCharset(httpParams, "UTF-8");
    HttpConnectionParams.setConnectionTimeout(httpParams, timeout);
    HttpConnectionParams.setSoTimeout(httpParams, timeout);
    httpRequest.setParams(httpParams);

    response = httpClient.execute(httpRequest);

    final int statusCode = response.getStatusLine().getStatusCode();

    if (statusCode == 300 || statusCode >= 305)
    {
        errorMessage = getStatusCodeMessage(statusCode, act);
    }
    else
    {
        HttpEntity entity = response.getEntity();

        if (entity != null)
        {

            InputStream instream = entity.getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(instream, "UTF-8"));
            StringBuilder sb = new StringBuilder();

            String line = null;
            while ((line = reader.readLine()) != null)
                sb.append(line);

            result = sb.toString();

        }
    }
}

Код в новой версии планшета:

if (CheckInternet())
{
    if (isCancelled()) return null; //that's for an AsyncTask

    URL myURL = new URL(params[0]);
    httpClient = AndroidHttpClient.newInstance("android");

    if (isCancelled()) return null;

    if (params[1] == null)
    {
        httpRequest = new HttpGet(myURL.toExternalForm());
    }
    else
    {
        httpRequest = new HttpPost(myURL.toExternalForm());

        HttpEntity myEntity = new StringEntity(params[1], "UTF-8");
        ((HttpPost) httpRequest).setEntity(myEntity);
    }

    httpRequest.setParams(httpParams);

    if (isCancelled()) return null;

    HttpResponse response = httpClient.execute(httpRequest);
    httpClient.close();

    if (isCancelled()) return null;

    final int statusCode = response.getStatusLine().getStatusCode();

    if (statusCode == 300 || statusCode >= 305)
    {
        error = HttpHelper.getStatusCodeMessage(statusCode, getActivity());
    }
    else
    {
        if (isCancelled()) return null;

        HttpEntity entity = response.getEntity();

        if (entity != null)
        {

            InputStream instream = entity.getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(instream, "UTF-8"));
            StringBuilder sb = new StringBuilder();

            String line = null;
            while ((line = reader.readLine()) != null)
                sb.append(line);

            String test = sb.toString(); //that was for debugging the string
            return test;

        }
    }
}

Оба запроса выполняются в AsyncTask.

С уважением, медуза

Ответы [ 2 ]

2 голосов
/ 05 июля 2011

Я не уверен, что это причина, но это выглядит подозрительно -

HttpResponse response = httpClient.execute(httpRequest);
httpClient.close(); // <--

Я бы подождал до окончания использования HttpEntity, прежде чем закрыть клиент.

0 голосов
/ 13 июля 2011

Я новичок в этом, поэтому, пожалуйста, прости меня, если я звучу как идиот.Я нашел интересный момент в этой статье:

http://android -developers.blogspot.com / 2010/12 / new-gingerbread-api-strictmode.html

Он сказал: «, вы никогда не должны выполнять сетевые запросы в вашем основном потоке. Фактически, в следующем выпуске Honeycomb мы сделали сетевые запросы в основном потоке фатальной ошибкой , если ваше приложение не ориентировано на версию API до Honeycomb"

Запускаете ли вы свой запрос в отдельном ASyncThread?Я не могу сказать, глядя на код.У меня сложилось время делать это самому.Пожалуйста, дайте мне знать, если вы придумали что-нибудь, как я хотел бы увидеть, как вы это сделали.

С уважением, Андрей

...