У меня есть настройка, где я выполняю свои 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-запросы в отдельном потоке, чтобы ответ мог обрабатываться в основном потоке?