读取大响应体作为HttpClient

时间:2014-06-12 21:26:17

标签: java android apache-httpclient-4.x

我正在构建一个Android应用程序,我必须从服务器中读取大量信息。

服务器将信息作为JSONArray发送,服务器端的一切都很好。

然而当我试图接收这个JSONArray时问题就出现了,因为它似乎对我来说太大了?

我使用HttpClient连接到服务器,如下所示:

HttpParams httpParams = new BasicHttpParams();
int timeoutConnection = 20000;
HttpConnectionParams.setConnectionTimeout(httpParams, timeoutConnection);
int timeoutSocket = 20000;
HttpConnectionParams.setSoTimeout(httpParams, timeoutSocket);

HttpClient client = new DefaultHttpClient(httpParams);
HttpGet request = new HttpGet();
request.setURI(url);

HttpResponse response = null;
try {
    response = client.execute(request);
} catch (ClientProtocolException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

BufferedReader in = null;
if (response != null) {
    in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()), 100000);
}

return in;

我只是尝试用readLine()方法读取BufferedReader中的内容,但是我得到的并不是响应的全部内容。我知道这是因为我尝试使用网络浏览器访问相同的内容并返回完整的内容。

来自服务器的响应是一行(可能会影响它,我不知道)

我能读4kb,我需要阅读高达141kb(所以我离我很远)..

我的个人猜测是我的代码中的某处存在大小限制。

额外我从BufferedReader读取这样的内容:

BufferedReader in = getResponse(new URI(params[0]));
// Read from the received buffer
String s;
StringBuilder sb = new StringBuilder(10000);

if(in != null){
    while ((s = in.readLine()) != null){
        sb.append(s);
    }
}

Log.d("问题:",sb.toString());

编辑:响应没有区别,它的长度始终相同

EDIT2:似乎Log.d()的打印长度有限制!开始没问题......对不起!

2 个答案:

答案 0 :(得分:1)

在HTTP请求中使用Gzip压缩JSON

查看此文章:http://arnab.ch/blog/2012/09/android-how-to-send-gzipped-json-in-http-request/

答案 1 :(得分:1)

而不是阅读InputStream,只需使用EntityUtils.toString

直接将其转换为字符串

示例:

 try {
    response = client.execute(request);
    HttpEntity resEntityGet = responseGet.getEntity(); 

    final String result = EntityUtils.toString(resEntityGet); //result is your json response

} catch (ClientProtocolException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}