Question

I have a setup where I perform my http requests in the doInBackground() method of an AsyncTask as follows:

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

This HttpResponse object is then passed on to the onPostExecute() method of my AsyncTask to be passed on to a handler (the original caller of the http request) and processed as necessary, as follows:

  • checking the response code using httpResponse.getStatusLine().getStatusCode();
  • getting the response content using EntityUtils.toString(httpResponse.getEntity())).

This setup has been working fine on phones running older versions of Android.

Running my app now on Ice Cream Sandwich (Galaxy Nexus) I find that the first few http requests in my app as above work fine but then there is this one http request which consistently throws an exception with a stack trace as follows (trimmed slightly for readability):

....

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)

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

android.os.NetworkOnMainThreadException

I am confused. Does this then mean that the EntityUtils.toString(HttpEntity) method is a potential culprit for throwing the new (and ever so annoying) NetworkOnMainThreadException? If so, any advice on reworking my setup to make http requests in a separate thread such that the response can be processed on the main thread?

Was it helpful?

Solution

Please try the following: modify your doInBackground function to return the value of the HTTP response.

protected String doInBackground(HttpRequestBase... httpRequests)
{
    HttpResponse httpResponse = HttpClient.execute(HttpUriRequest);
    if (httpResponse.getEntity() != null) {
      return EntityUtils.toString(httpResponse.getEntity());
    }
    return "";
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top