サーバから画像をダウンロードしてリストビューに表示するアプリケーションを作成しようとしています。私が作った問題は、メモリのリークで、アプリケーションがクラッシュすることでした。私はこのlinkのようなAndroidのブログで検索していましたが、それは素晴らしいアイデアを示していますが、まだ複数のスレッドでそれを行うには不十分です。アンドロイドのいくつかのデバイスは、それを使用することができますが、いくつかのデバイスは、単一のスレッドでのみ処理することができ、まったく動作しないことがあります。Androidから画像をダウンロードし、BitmapFactoryを使わずにsdcardに保存する
私のアプリケーションには多くのアクティビティがあり、それぞれにはできるだけ早くイメージを表示する必要があるListviewがあります。 Google IO 2012を使用すると、バッファを使用して元の画像をSDカードに保存し、問題を解決します。メモリをリークしますが、ダウンロードが必要な画像が大きすぎるため読み込みが遅くなります。
私の質問は:SDカードに画像を書き込んで画像を拡大縮小する方法はありますか? 私はいくつかの可能な解決策は、入力ストリームオブジェクトのスキップバイトを使用することであると私は、ダウンロードする必要がある画像のピクセルあたりビット幅と高さを見つけることができました。
次のコードはGoogle IO 2012で使用されていましたが、複数のスレッドでうまく動作します。私の場合、4スレッドがバックグラウンドで実行されています。
private void downloadAndWriteFile(final String url, final File file) throws OutOfMemoryError {
BufferedOutputStream out = null;
try {
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setDoInput(true);
conn.connect();
final InputStream in = new BufferedInputStream(conn.getInputStream(), IO_BUFFER_SIZE_BYTES); // buffer size 1KB
out = new BufferedOutputStream(new FileOutputStream(file), IO_BUFFER_SIZE_BYTES);
int b;
while ((b = in.read()) != -1) {
out.write(b);
}
out.close();
conn.disconnect();
}
catch (Exception e) {
Log.e(TAG, "!!downloadAndWriteFile " + e.getMessage());
file.delete();
}
}
あなたの答えをありがとう、私はすでにこのケースを通過していましたが、JNIがより多くのメモリを割り当てることを許可しないデバイスでは、複数のスレッドでリークメモリを取得します。 Google IO 2012のコードは、すべてのデバイスをサポートする複数のスレッドで動作させることができますが、イメージが大きすぎると遅くなります。どういうわけか、ユーザーは最初に読み込んだアクティビティをすばやくナビゲートしているので、まったくうまくいきません。 – vsatkh