Die folgende Methode fällt beim Lesen der HttpResponse mit dem Fehler: "Inhalt wurde verbraucht". Ich verstehe, dass der Inhalt nur einmal konsumiert werden kann, aber ich bekomme diesen Fehler beim ersten Versuch und ich sehe nirgendwo im Code, wo ich es möglicherweise zweimal konsumiere.Android HttpResponse - Inhalt wurde verbraucht
Antwort
Ist dies im Emulator oder auf Ihrem Handy? Es könnte ein emulatorspezifisches Problem sein. Ich habe es auf meinem Gerät getestet, und es funktioniert perfekt.
Haben Sie vielleicht eine Debugger-Uhr, die den Inhalt konsumieren könnte?
Ich habe alles auf den neuesten Stand gebracht (ADT, SDK) und es gibt immer noch Probleme auf meinem Handy im Debug-Modus und auf dem Emulator. – JBehrendt
Das war es - danke! Ich hatte eine Beobachtung auf entity.getContent(). Entfernte die Uhr und alles funktioniert 100%. – JBehrendt
Ich hatte den gleichen Fall, Uhr wurde auf entity.getcontent() eingestellt Uhr zu entfernen löste mein Problem. – UMAR
Sie erhalten Data() -Methode ist perfekt und es funktioniert gut Ich habe diesen Code bereits verwendet, um zu überprüfen, und es funktioniert perfekt für mich.
also könnte es möglich sein, dass Sie diese Methode zweimal aufgerufen haben. Wenn Sie überprüfen möchten, was ich verwende, überprüfen Sie unten Code ich erhalte das Ergebnis perfekt.
package com.sandeeppatel.httpget;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.Activity;
import android.os.Bundle;
public class HttpGetActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
StringBuilder builder = new StringBuilder();
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("http://www.vogella.com");
/*if (params != null) {
httpGet.setParams(params);
}*/
String result = "";
try {
HttpResponse response = client.execute(httpGet);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
content.close();
result = builder.toString();
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
// return result;
}
}
Und nur ich gebe dem Internet nur die Erlaubnis. Immer noch, wenn Sie das nicht bekommen, geben Sie mir Ihre URL und Params.
Das habe ich mir gedacht. Der Code läuft auf einem Kollegen-PC zu 100% einwandfrei, aber bei mir gibt es im Debug-Modus sowohl auf meinem Emulator als auch auf meinem Handy "Inhalt wurde verbraucht". Ich habe den ADT und das SDK nur aktualisiert, um sicher zu sein, aber das hat das Problem nicht gelöst. – JBehrendt
Ich denke, Ihr Code ist richtig. Versuchen Sie dies, um auf die Zeichenfolge von HttpEntity zuzugreifen: String response_str = EntityUtils.toString (responseEntity, HTTP.UTF_8);
, wie ich in meiner Methode verwendet:
public String SetObjectSecurity(String username, String password,
String clientName,String docRid,String ObjectRidsForCheckSum) throws JSONException, ClientProtocolException, IOException
{
String SetObjectSecurityURL = "url";
StringEntity str_request_entity = null;
HttpResponse http_response = null;
HttpGet getrequest = new HttpGet(SetObjectSecurityURL);
postrequest.setHeader("Accept", "application/json");
postrequest.setHeader("Content-type", "application/json");
//set param here
HttpClient httpClient = new DefaultHttpClient();
http_response = httpClient.execute(getrequest);
//Log.e("Status code ",http_response);
HttpEntity responseEntity = http_response.getEntity();
String response_str =EntityUtils.toString(responseEntity, HTTP.UTF_8);
Log.e("output",response_str);
int i = http_response.getStatusLine().getStatusCode();
Log.e("status","code "+i);
if(i==this){
do this}
else
{
this
}
return response_str;
}
Dies kann passieren, wenn Sie an das Unternehmen zu mehr sind raubend als einmal in einem ähnlichen Aufruf an diesen:
EntityUtils.toString(entity, HTTP.UTF_8))
sicher, dass Sie nicht in der Eclipse Watch-Ansicht etwas wie http_response.getEntity() Wenn Sie das tun, dann ist das, was Ihren Stream verbraucht ...
Sind Sie sicher, dass die Ausnahme nur in diesem Codeblock generiert wird? – jeet
Was ist das Ergebnis des Aufrufs von 'isStreaming' in Ihrer Antworteinheit? – Perception
Legen Sie ein paar Protokolle in die verschiedenen Blöcke und überprüfen Sie, ob etwas zweimal aufgerufen wird. Wenn das nicht hilft, geben Sie den Code, wo Sie es anrufen, und auch das Logcat an. – Shubhayu