У меня есть настройка, в которой я выполняю свои 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-запрос, который последовательно генерирует исключение с трассировкой стека следующим образом (слегка обрезанный для читабельность):
....
в org.apache.http.util.EntityUtils.toString(EntityUtils.java:139)
в java.io.InputStreamReader.close(InputStreamReader.java:145)
в org.apache.http.conn.EofSensorInputStream.close(EofSensorInputStream.java:213)
...
на libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:151)
в android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084)
android.os.NetworkOnMainThreadException
Я сбит с толку. Означает ли это, что метод EntityUtils.toString(HttpEntity)
является потенциальным виновником выбрасывания нового (и очень раздражающего) NetworkOnMainThreadException
? Если да, то какие-либо советы по переделке моей настройки, чтобы делать http-запросы в отдельном потоке, чтобы ответ можно было обрабатывать в основном потоке?
EntityUtils.toString
: .com/questions/30642237/ - person Christophe Roussy   schedule 25.04.2017