Мне нужно загрузить контактные данные через 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