プロが教えるわが家の防犯対策術!

HTTP通信で大容量のデータを受信する際の処理について

いつもお世話になっております。

現在、サーバーから大容量コンテンツ(動画など)をダウンロードして表示する処理を試してます。

テキストやサムネイル画像程度ならダウンロード出来るのですが10MB程度になるとメモリアウトオブエラーで落ちてしまいます。

分割してダウンロードするなど工夫が必要と思い色々試してみましたがうまく行きません。

------------現在下記様に記述してます。------------
int size;
InputStream in = con.getInputStream();
ByteArrayOutputStream out = new ByteArrayOutputStream();
while (true) {
  size = in.read(w);
  if (size <= 0) break;
  out.write(w, 0, size);
}
------------------------------------------------------------------------

どなたか詳しい方、いらっしゃいましたらご教授のほどよろしくお願いします。
※モバイル環境(Android)のため省メモリです。

A 回答 (3件)

一つの方法としては、


ダウンロードしたデータを部分的に収めるバッファを複数用意し、
データをダウンロードするスレッドとデータを表示するスレッドを作る。
ダウンロードスレッドは空きバッファにデータを埋めてゆき、
バッファが一杯になったら表示スレッドに報せ、
使える空きバッファが無くなったらそれができるまで休止状態に移行する。
表示スレッドは順次一杯になったバッファからデータを消費していき、
そのバッファのデータを消費しきったら空いたことをダウンロードスレッドに報せ、
ダウンロード中か空きのバッファしかなくなったら、
使えるバッファができるまで休止状態やnow loading表示に移行する。
どれくらいのサイズのバッファを何個用意するかは、対応させたい環境のメモリ容量と
ダウンロードスピードと表示スピード、表示品質などとの兼ね合いで調整する必要がある。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

ByteArrayStreamを使用してましたのでメモリに配置してファイルと言う方法でしたが、
FileOutStreamを使用してそのままファイルに保存することで解決しました。

上記方法も参考になりました。
ありがとうございます。

お礼日時:2010/06/01 10:17

10M全部キャッシュしちゃっているのよね。


まめに書き出したらどお?

この回答への補足

askaaskaさん
回答ありがとうございます。

当方もそのようにしたいと思っておりますが、経験不足からどのように記述したらよいか分かりません。
一般的にどのように記述するのでしょうか?
上記プログラムを改良する形で色々と試しているのですが方法を見出せておりません。

もし最適な記述方法がありましたらご教授のほど宜しくお願いします。

補足日時:2010/05/28 14:17
    • good
    • 0

10Mbで落ちるのは、あなたのハードの問題としか考えられません。

ハード環境の詳細を知る必要がありそうです。

この回答への補足

回答ありがとうございます。

場合によっては動画で400MBの場合もあります。
その場合はどのように実装すべきでしょうか?

スマートフォンですので端末やアプリの使用状況などで容量はマチマチです。

補足日時:2010/05/28 00:08
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!