ben*_*rtz 7 java json inputstream httpclient
我需要通过REST API下载联系人数据,我以JSON格式获取.问题是,它可能是很多联系人,所以我想观察进度(已经下载了多少联系人)并向用户报告(带有进度条,下面的代码在一个线程中运行).
但是,似乎行client.execute(getRequest); 建立连接并一次性下载整个内容,即我的InputStream阅读器(以块为单位获取内容)似乎没用.现在我想知道如何让它在大块中工作,所以我可以报告进展情况?
/** prepare HTML get request */
HttpGet getRequest = new HttpGet(url[0]);
getRequest.addHeader("Authorization", "OAuth " + myTokens.get_access_token());
/** execute HTML request */
DefaultHttpClient client = new DefaultHttpClient();
JSONArray records = null;
HttpResponse response = client.execute(getRequest);
/** init response handlers for input stream */
InputStream input = new BufferedInputStream(response.getEntity().getContent());
byte data[] = new byte[MAX_BUFFER_SIZE];
long totalContactsCount = -1;
int readContactsCount = 0;
int currentByteReadCount = 0;
/** read response from inpus stream */
while ((currentByteReadCount = input.read(data)) != -1) {
String readData = new String(data, 0, currentByteReadCount);
dataString.append(readData);
// then +1 progress on every ...},{... (JSON object separator)
if (readData.indexOf("},{") >= 0) {
readContactsCount++;
}
// publishing the progress....
if (totalContactsCount > 0) {
publishProgress((int)(readContactsCount * 100 / totalContactsCount));
}
}
input.close();
/** transform response into JSONArray */
String result = dataString.toString();
//... convert into JSONArray
Run Code Online (Sandbox Code Playgroud)
不幸的是,从 的文档看来DefaultHttpClient
,该execute
方法返回一个已经解析的 HTTP 响应,因此已经从网络读取,因此您无法插入输入流。该流已准备好供您阅读,但正如您所注意到的,一旦它被检索。你必须使用另一种策略。例如,尝试使用套接字 API 进行连接。
归档时间: |
|
查看次数: |
3673 次 |
最近记录: |