Может ли EntityUtils.toString () вызвать исключение NetworkOnMainThreadException? - PullRequest
2 голосов
/ 03 апреля 2012

У меня есть настройка, где я выполняю свои http-запросы методом doInBackground() для AsyncTask следующим образом:

@Override
protected HttpResponse doInBackground(HttpRequestBase... httpRequests)
{
    HttpResponse httpResponse = HttpClient.execute(HttpUriRequest);
    return httpResponse;
}

Этот HttpResponse объект затем передается методу onPostExecute() моего AsyncTask для передачи в обработчик (исходный вызывающий запрос http) и при необходимости обрабатывается следующим образом:

  • проверка кода ответа с помощью httpResponse.getStatusLine().getStatusCode();
  • получение содержимого ответа с использованием EntityUtils.toString(httpResponse.getEntity())).

Эта установка работала нормально на телефонах под управлением более старых версий Android.

Запуск моего приложения сейчас в Ice Cream Sandwich (Galaxy Nexus) Я обнаружил, что первые несколько http-запросов в моем приложении, как указано выше, работают нормально, но затем есть один http-запрос, который последовательно выдает исключение с трассировкой стека следующим образом ( слегка подрезан для удобства чтения)

....

at org.apache.http.util.EntityUtils.toString (EntityUtils.java:139)

at java.io.InputStreamReader.close (InputStreamReader.java:145)

at org.apache.http.conn.EofSensorInputStream.close (EofSensorInputStream.java:213)

...

at libcore.io.BlockGuardOs.recvfrom (BlockGuardOs.java:151)

в android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork (StrictMode.java:1084)

android.os.NetworkOnMainThreadException

Я в замешательстве. Значит ли это, что метод EntityUtils.toString(HttpEntity) является потенциальным виновником бросания нового (и очень раздражающего) NetworkOnMainThreadException? Если да, то есть ли какие-либо рекомендации по переработке моей настройки, чтобы сделать http-запросы в отдельном потоке, чтобы ответ мог обрабатываться в основном потоке?

1 Ответ

5 голосов
/ 03 апреля 2012

Пожалуйста, попробуйте следующее: измените функцию doInBackground, чтобы она возвращала значение ответа HTTP.

protected String doInBackground(HttpRequestBase... httpRequests)
{
    HttpResponse httpResponse = HttpClient.execute(HttpUriRequest);
    if (httpResponse.getEntity() != null) {
      return EntityUtils.toString(httpResponse.getEntity());
    }
    return "";
}
...