2012-03-19 7 views
2

私はファイルをダウンロードしようとしているアプリを持っています。私はHTTPUrlConnectionをダウンロードに使用しています。当初、ダウンロード速度は遅かったです。Android/Java低速ネットワークIO

私は、バッファリングされた入力ストリームを使用し、バッファサイズを1024から8192に増やすことでパフォーマンスを改善しました。それを超えてバッファを増やしても、改善はありませんでした。ここで

は抜粋です。でも、この後

InputStream inputStream = (InputStream) new URL(requestURL) 
        .getContent(); 
BufferedInputStream bufferedInputStream = new BufferedInputStream(
        inputStream); 
OutputStream outputStream = new FileOutputStream(fileSaveUrl); 
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(
        outputStream);  

int bytesToRead = 1024 * 256; 
byte buffer[] = new byte[bytesToRead]; 
while ((count = bufferedInputStream.read(buffer)) != -1 
    && !isCancelled()) { 
     requestStatus((int) (downloaded * 100/fileSize)); 
     bufferedOutputStream.write(buffer, 0, count); 
} 

、2倍速くiPad上のAndroidと比較すると、同じファイルがダウンロードされます。

何か不足していますか?

編集

  1. あなたが/言及を尋ねる前にも、ダウンロードが別のスレッドで実行されています。 私は出力をバッファリングする必要はありません実現しないが、私は後でそれに周りを取得します:)
  2. bytesToReadについて:私は別のバッファサイズで実験して、最後の実験は256キロバイト
+0

ディスクへのデータの書き込みを無効にするとスピードアップが試行されましたか? – Robert

+0

Androidにはヒープサイズが限られているため、Appsに提供するヒープサイズは制限されているため、SDカードに直接書き込むことができます。また、私はいくつかのテストを実行しました。ファイルセクションへの書き込みは、プログラム全体を遅くするものではありません。 –

+1

"私はいくつかのテストを実行しましたが、ファイルセクションへの書き込みはプログラム全体を遅くしていません" - それはすべきです。通常、マルチスレッドプログラミングでは、最大限のパフォーマンスを目指している場合は、読んでいるスレッドとは別のスレッドで記述します。 – CommonsWare

答えて

2

問題は、同じスレッドでSDカードにダウンロードして書き込んでいることでした。パフォーマンスを向上させるために、ブロックキューバッファを使用して作業を2つのスレッドに分割します。

2
requestStatus((int) (downloaded * 100/fileSize)); 
ました

これは1つのボトルネックになる可能性があります。あなたが仕事をしている同じスレッドのステータスを更新するのは良い考えではありません。あなたのスレッドは...

variable = (int) (downloaded * 100/fileSize); 

を揮発性の変数を更新する必要があります次に、あなたのUIスレッドは、進行状況を表示するために、その変数をポーリングする必要があります。

また、最も安価なSDカードは遅いですが、それらに書き込むと大容量ファイルの処理速度が低下する可能性があります。

+0

これはボトルネックではありませんが、非常に有効な点です:) –

関連する問題