2012-04-16 13 views
6

Poniższa metoda wypada podczas odczytu HttpResponse z błędem: "Treść została zużyta". Rozumiem, że treść może zostać zużyta tylko raz, ale pojawia się ten błąd przy pierwszej próbie i nie widzę nigdzie w kodzie, w którym potencjalnie zajmuję to dwa razy.Android HttpResponse - Zawartość została zużyta

private static String getData(String url, HttpParams params) { 
    StringBuilder builder = new StringBuilder(); 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet(url); 
     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; 
    } 
+0

czy jesteś pewien, że wyjątek jest generowany tylko w tym bloku kodu – jeet

+0

Jaki jest wynik wywołania 'isStreaming' na twojej jednostce odpowiedzi? – Perception

+0

Umieść kilka dzienników w różnych blokach i sprawdź, czy coś jest wywoływane dwa razy. Jeśli to nie pomoże, podaj kod, do którego dzwonisz, oraz logcat. – Shubhayu

Odpowiedz

2

Czy jest to emulator czy telefon? Może to być problem specyficzny dla emulatora. Przetestowałem to na moim urządzeniu i działa idealnie.

Czy może masz zegarek debuggera, który może pochłaniać zawartość?

+1

Uaktualniłem wszystko do najnowszego (ADT, SDK) i nadal powoduje problemy zarówno na moim telefonie w trybie debugowania i na emulatorze. – JBehrendt

+4

To wszystko - dzięki! Miałem zegarek na entity.getContent(). Usunięto zegarek i wszystko działa w 100%. – JBehrendt

+1

Miałem ten sam przypadek, zegarek został ustawiony na entity.getcontent() usunięcie zegarka rozwiązało mój problem. – UMAR

1

Twoja metoda Data() jest idealna i działa dobrze. Już użyłem tego kodu do sprawdzenia i działa to idealnie dla mnie.

, więc istnieje możliwość, że nazwałaś tę metodę dwukrotnie. jeśli chcesz sprawdzić, co używam, sprawdź poniższy kod i uzyskaj perfekcyjny wynik.

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; 
} 
} 

I tylko ja udzielam tylko dostępu do Internetu. Nadal, jeśli nie dostaniesz tego, daj mi swój adres URL i parametry.

+0

Tak myślałem. Kod działa na 100% poprawnie na komputerze współpracowników, ale ze mną daje "treść została zużyta" zarówno na moim emulatorze, jak i na moim telefonie w trybie debugowania. Uaktualniłem ADT i SDK tylko, aby się upewnić, ale to nie rozwiązało problemu. – JBehrendt

1

Myślę, że twój kod jest właściwy. ale spróbuj tego, aby uzyskać dostęp do łańcucha od HttpEntity: String response_str = EntityUtils.toString (responseEntity, HTTP.UTF_8);

jak kiedyś w moim sposobem:

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; 
     } 
2

To może się zdarzyć, jeśli jesteś spożywania podmiot więcej niż raz, w podobny wezwanie do tego:

EntityUtils.toString(entity, HTTP.UTF_8)) 
6

upewnić się, że nie masz w widoku obserwacyjnym Eclipse czegoś podobnego do http_response.getEntity() Jeśli to zrobisz, to właśnie to zużywa Twój strumień ...

Powiązane problemy