如何获取块中的JSON数据来报告进度?

我需要通过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

你可能想看看这个stackoverflow线程,其中提出了类似的问题。 从那里看来,这个网站可能是相关的。


不幸的是,从DefaultHttpClient的文档中可以DefaultHttpClientexecute方法返回已经解析过的HTTP响应,因此已经从网络中读取,因此您无法插入输入流。 您已经注意到,该流已经准备好供您阅读,但一旦它被回收了, 你必须使用另一种策略。 例如,使用套接字API尝试自己的连接。


您可以先向Web服务询问它所拥有的联系人总数(比如100,000),然后询问它是否存在联系人的单个“页面”(比如说100个联系人/页面)。 当每个页面到达时,您都会更新进度栏。 如果页面请求失败,请重试该请求并继续处理。 这应该是一个比试图在一次大规模请求中获得所有100k联系人更可靠和更高效的方法。

链接地址: http://www.djcxy.com/p/53595.html

上一篇: How to get JSON data in chunks to report on progress?

下一篇: Struts2 how to create multiple views for mobile and desktop