2011-01-29 8 views
3

私はアンドロイドアプリでダウンロードしています。私はローカルネットワーク接続を使用しており、ダウンロードは本当に遅いです。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

私は答えにこれをあげますよ。 –

+1

あなたはどんなスピードであなたはどんなスピードを期待していますか?あなたのIOのスピードに疑問を抱いているなら、最初にやるべきことは時間です。あなたの改善が大きな違いをもたらすかどうかを知ることができます。 –

+0

publishProgress()で何をしていますか? (少しのコードが役に立ちます..) – ap400200

答えて

4

入力ストリームをBufferedInputStreamでラップする必要があります。あなたはたぶん、数バイトの浅い読み取りをたくさん得ているでしょうし、バッファされたストリームはその一部を緩和します。最初に、OSレベルの書き込み遅延を減らすために入力ストリームと出力ストリームの両方をバッファリングしてみます。

第2に、進捗状況の投稿方法に注意が必要です。それは、あなたがそれが来る回数を制限しているように見えますが、ダウンロードを独自の実行可能ファイルに移動し、ダウンロードのためにエグゼキュータサービスを使用し、すべてのダウンロードの進行状況を評価し、必要に応じてメッセージを送信します。

+1

FileOutputStreamもおそらくBufferedOutputStreamにラップされるはずです。私はこれがAndroidのAsyncTaskの一部だと推測しているので、publishProgressはダウンロードをブロックせずにUIスレッドにメッセージをキューに入れます。だからpublishProgressはおそらくここでは問題ではない*でしょう。 –

2

利用HttpClient代わりのURLConnection