2012-03-07 66 views
2

我正在嘗試執行http-get-request並向用戶顯示下載進度。我熟悉AsyncTask的概念,我也知道如何使用URLConnection和BufferedInputStream一起下載文件,同時顯示進度,並且我知道如何執行http-get請求並接收HttpResponse:如何異步執行httprequest並顯示下載響應的進度

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

但我只是無法弄清楚如何顯示執行方法的進度。我找到了下面的方法。但是,在所有數據已經​​下載之後,從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(); 
} 

謝謝!

回答

2

該代碼看起來不錯。 InputStream是您下載的數據流。在下載每個塊時,將該塊保存到文件中並更新進度。這不是在數據已經下載之後。

+0

啊 - 謝謝!所以我只是感到困惑,因爲執行方法的延遲。但是,這實際上來自發送請求和接收標題的工作;我現在正確嗎? – Thassilo 2012-03-07 01:21:38

+0

是的,聽起來沒錯。如果你願意,你可以比較下載一些非常大的文件並看看。開始時的停頓時間應該大致相同,然後您應該看到進度更新按預期進行。 – kabuko 2012-03-07 01:24:55