2011-01-29 120 views
3

我正在我的android應用程序下載。我正在使用本地網絡連接,下載速度非常慢。Android緩慢文件下載

下面是我使用他的代碼:

URL url = new URL(ep.getFileURL()); 
File destFile = new File(<path to sd card file>); 

URLConnection uCon = url.openConnection(); 
InputStream is = uCon.getInputStream(); 
OutputStream os = new FileOutputStream(destFile); 

int progress = 0; 
int lastProgress = 0; 
int totalSize = uCon.getContentLength(); 
int downloadedSize = 0; 
byte[] buffer = new byte[4096]; 
int count = -1; 
while((count = is.read(buffer)) != -1) 
{ 
    os.write(buffer, 0, count); 

downloadedSize = downloadedSize + count; 
    progress = (int)(downloadedSize * 100.0/totalSize); 
    if(progress - lastProgress >= 5) { 
     publishProgress(progress); 
     lastProgress = progress; 
    } 
} 

os.close(); 

你發現什麼問題嗎?謝謝。

編輯:

我用你的建議測試我的代碼,我得到了這些結果:

 
# Download times tests # 

Without bufferedoutput 
Downloading file:  1 ms, Start download 
Downloading file:  179812 ms, Finished downloading 54687744 bytes 
Downloading file: end, 179813 ms 

With bufferedoutput 
Downloading file:  1 ms, Start download 
Downloading file:  178312 ms, Finished downloading 54687744 bytes 
Downloading file: end, 178313 ms 

With httpclient 
Downloading file: begin 
Downloading file:  1 ms, Start download 
Downloading file:  178241 ms, Finished downloading 54687744 bytes 
Downloading file: end, 178242 ms 

所以,使用緩衝流或者直接使用HttpClient的,並不能改變什麼?

我也應該提到我的代碼是在一個AsyncTask中,所以publishProgress()實際上已經在一個單獨的線程上運行了...

謝謝你的幫助。

+0

我會把它放在一個答案中。 – 2011-01-29 04:19:19

+1

你會得到什麼速度,以及你期望得到什麼樣的速度?如果你質疑IO的速度,你應該做的第一件事就是時間,以便你可以判斷你的改進是否會產生重大影響。 – 2011-01-29 04:23:59

回答

4

你應該用BufferedInputStream包裝你的輸入流。你可能會得到更多的幾個字節的淺層讀取,而緩衝的流將緩解其中的一些。我會首先嚐試緩衝輸入和輸出流,以減少操作系統級別的寫入延遲。

其次,我會小心你如何發佈進度。它看起來像限制了它出現的次數,但是你可能想要將下載移動到它自己的可運行的並且使用一個執行器服務來下載,並且可能啓動一個額外的線程來評估所有下載的進度並激發進度必要的消息。

2

使用HttpClient而不是URLConnection