2012-04-03 8 views
2

Ich habe ein Setup, wo ich meine HTTP-Anfragen in der doInBackground() Methode eines AsyncTask wie folgt durchführen:Kann EntityUtils.toString() eine NetworkOnMainThreadException verursachen?

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

Diese HttpResponse wird dann auf die onPostExecute() Methode meiner AsyncTask weitergegeben an einem Handler übergeben werden (der ursprüngliche Anrufer der hTTP-Anforderung) und nach Bedarf verarbeitet werden, wie folgt:

  • den Antwortcode Überprüfung httpResponse.getStatusLine().getStatusCode() verwendet wird;
  • Erhalten der Antwort Inhalt mit EntityUtils.toString(httpResponse.getEntity())).

Diese Einrichtung funktioniert auf Telefonen mit älteren Android-Versionen einwandfrei.

Meine App jetzt auf Ice Cream Sandwich (Galaxy Nexus) ausführen Ich finde, dass die ersten paar HTTP-Anfragen in meiner App wie oben funktionieren, aber dann gibt es diese http-Anfrage, die konsequent eine Ausnahme mit einem Stack-Trace wie folgt auslöst (leicht zur besseren Lesbarkeit getrimmt):

....

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

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

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

...

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

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

android.os.NetworkOnMainThreadException

Ich bin verwirrt. Bedeutet das dann, dass die EntityUtils.toString(HttpEntity) Methode ein möglicher Schuldiger für das Werfen des neuen (und überhaupt so ärgerlichen) NetworkOnMainThreadException ist? Wenn ja, gibt es einen Hinweis zur Überarbeitung meines Setups, um http-Anfragen in einem separaten Thread zu stellen, so dass die Antwort im Hauptthread verarbeitet werden kann?

+0

ich das gleiche Problem haben, aber es geschieht nur auf einigen Telefonen und nur auf einige Anfragen .. Manchmal EntityUtils.toString funktioniert gut .. seltsam –

+0

auch die Standard-charset von 'EntityUtils.toString' Vorsicht: http://stackoverflow.com/questions/30642237/what-exactly-returns-entityutils-tostringresponse/43611274#43611274 –

Antwort

5

Bitte versuchen Sie Folgendes: Ändern Sie Ihre doInBackground-Funktion, um den Wert der HTTP-Antwort zurückzugeben.

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

Das gibt mir nur die Nachrichtsentität der Antwort. Ich brauche auch die Statuszeile (d. H. "HttpResponse.getStatusLine()") und möglicherweise auch das Gebietsschema der Antwort (d. H. "HttpResponse.getLocale()"). Ich denke, ich muss alle diese Eigenschaften in der 'AsynTask.doInBackground()' Methode, wie Sie vorschlagen, extrahieren und dann in meine eigene 'ServerResponse' Klasse einbinden, um sie an die 'onPostExecute()' Methode zu übergeben ... Es sei denn, es gibt einen besseren Weg ?! –

+0

Ja. Du musst es auf diese Weise tun. – Blehi

+0

Sind Sie sicher, dass Sie es so machen müssen? Warum sollten diese Methoden Networking betreiben ??? – Adam