2012-04-16 17 views
6

Phương pháp bên dưới sẽ bị đổ vỡ khi đọc HttpResponse với lỗi: "Nội dung đã bị tiêu thụ". Tôi hiểu rằng nội dung chỉ có thể được sử dụng một lần nhưng tôi nhận được lỗi này trong lần thử đầu tiên và tôi không thấy bất kỳ nơi nào trong mã nơi tôi có thể tiêu thụ nó hai lần.Android HttpResponse - Nội dung đã được tiêu thụ

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

là bạn chắc chắn ngoại lệ được tạo ra chỉ trong khối mã này – jeet

+0

Kết quả của việc gọi 'isStreaming' trên thực thể phản hồi của bạn là gì? – Perception

+0

Đặt một vài bản ghi trong các khối khác nhau và kiểm tra xem một cái gì đó đang được gọi là hai lần. Nếu điều đó không giúp được, hãy cung cấp mã nơi bạn đang gọi nó và cũng là logcat. – Shubhayu

Trả lời

2

Đây có phải là trình giả lập hoặc trên điện thoại của bạn không? Nó có thể là một vấn đề mô phỏng cụ thể. Tôi đã thử nghiệm nó trên thiết bị của tôi, và nó hoạt động hoàn hảo.

Bạn có thể có một chiếc đồng hồ gỡ lỗi có thể đang sử dụng nội dung không?

+1

Tôi đã nâng cấp mọi thứ lên (ADT, SDK) mới nhất và nó vẫn đưa ra các sự cố trên cả hai điện thoại của tôi ở chế độ gỡ lỗi và trên trình mô phỏng. – JBehrendt

+4

Đó là nó - cảm ơn! Tôi đã có một chiếc đồng hồ trên entity.getContent(). Loại bỏ đồng hồ và mọi thứ đang hoạt động 100%. – JBehrendt

+1

tôi đã có cùng một trường hợp, đồng hồ đã được đặt trên entity.getcontent() xóa đồng hồ đã giải quyết được sự cố của tôi. – UMAR

1

Phương thức Data() nhận được là hoàn hảo và nó hoạt động tốt tôi đã sử dụng mã này để kiểm tra và nó hoạt động hoàn hảo cho tôi.

vì vậy có thể có khả năng bạn đã gọi phương thức này hai lần. nếu bạn muốn kiểm tra những gì tôi đang sử dụng kiểm tra dưới đây mã tôi nhận được kết quả hoàn hảo.

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

Và chỉ cần tôi cho phép Internet. Vẫn còn nếu bạn không nhận được điều này cho tôi địa chỉ và thông số của bạn.

+0

Đó là những gì tôi nghĩ. Mã chạy 100% tiền phạt trên một đồng nghiệp pc nhưng với tôi nó cho "nội dung đã được tiêu thụ" trên cả giả lập của tôi và trên điện thoại của tôi trong chế độ gỡ lỗi. Tôi đã nâng cấp ADT và SDK chỉ để chắc chắn nhưng điều đó không giải quyết được vấn đề. – JBehrendt

1

Tôi nghĩ mã của bạn là đúng. nhưng hãy thử điều này để truy cập chuỗi từ HttpEntity: Chuỗi response_str = EntityUtils.toString (responseEntity, HTTP.UTF_8);

như tôi được sử dụng trong phương pháp của tôi:

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

Điều này có thể xảy ra nếu bạn đang tiêu thụ các thực thể nhiều hơn một lần, trong một cuộc gọi tương tự như sau:

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

chắc chắn rằng bạn không có trong chế độ xem đồng hồ Eclipse, chẳng hạn như http_response.getEntity() Nếu bạn làm vậy, thì đây là những gì tiêu thụ luồng của bạn ...