Как асинхронно выполнить httprequest и показать ход загрузки ответа - PullRequest
2 голосов
/ 07 марта 2012

Я пытаюсь выполнить http-get-запрос и показать пользователю процесс загрузки.Я знаком с концепцией AsyncTask, я также знаю, как использовать URLConnection вместе с BufferedInputStream для частичной загрузки файла, показывая прогресс, и я знаю, как выполнить http-get-request и получить HttpResponse:

HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(url);
HttpResponse response = httpclient.execute(httpget);

Но я просто не могу понять, как показать прогресс метода execute.Я нашел метод ниже.Но что все это копирует из InputStream в OutputStream после того, как все данные уже загружены?Я не хочу видеть прогресс этого процесса копирования, но прогресс HttpResponse!- Какие-либо предложения?Где моя ошибка в рассуждениях?У меня сильное чувство, что я пропустил что-то очень важное ...

String sURL = getString(R.string.DOWNLOAD_URL) + getString(R.string.DATABASE_FILE_NAME);
HttpClient  httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(sURL);
HttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
Header[] clHeaders = response.getHeaders("Content-Length");
Header header = clHeaders[0];
int totalSize = Integer.parseInt(header.getValue());
int downloadedSize = 0;
if (entity != null) {
    InputStream stream = entity.getContent();
    byte buf[] = new byte[1024 * 1024];
    int numBytesRead;

    BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(file));
    do {
        numBytesRead = stream.read(buf);
        if (numBytesRead > 0) {
            fos.write(buf, 0, numBytesRead);
            downloadedSize += numBytesRead;
            //updateProgress(downloadedSize, totalSize);
        }
    } while (numBytesRead > 0);
    fos.flush();
    fos.close();
    stream.close();
    httpclient.getConnectionManager().shutdown();
}

Спасибо!

1 Ответ

2 голосов
/ 07 марта 2012

Этот код выглядит хорошо. InputStream - это поток данных, который вы загружаете. При загрузке каждого чанка вы сохраняете его в файл и обновляете свой прогресс. Это не после того, как данные уже загружены.

...