我正在尝试执行http-get-request并向用户显示下载进度。我熟悉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();
}


谢谢!

最佳答案

该代码看起来不错。 InputStream是您正在下载的数据流。下载每个块时,会将其保存到文件中并更新进度。并非已经下载数据之后。

10-07 19:14
查看更多