0

複数の写真のサムネイルを表示する画面を読み込んで表示しようとしています。それらをすべてビットマップとして読み込もうとすると、ビットマップがやや大きく、画面サイズに応じて 10 ~ 20 個を読み込んでいるため、OutOfMemoryError が発生することがよくあります。写真はすべて同じサイズではないため、表示しようとしているサブセットによっては、すべてを読み込むのにメモリが十分でない場合があり、アプリが不規則にクラッシュします (ユーザーがスクロール中にクラッシュすることがあります)。写真グリッドをスクロールしています)。

注: サムネイルを表示しているので、ロードされたビットマップがフル解像度である必要はありません。ロードする前にビットマップのサイズを確認する方法はありますか?また、ビットマップの「プレビュー」またはダウンサンプリングされたバージョンのみをディスクにロードして、メモリを節約し、メモリへのヒットを回避する方法はありますか?限界?

4

1 に答える 1

4

はい、 を介してビットマップをロードする場合BitmapFactory、 を使用BitmapFactory.Optionsして、ビットマップのタイプ、幅、および高さのみを検査するように指定できます。

// Read bitmap size and type only
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imagePath, options);

int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;

BitmapFactory.Options を使用すると、ダウンサンプリングされたバージョンのビットマップをロードするように指定することもできます。必要なのは、ダウンサンプリング係数である inSampleSize を指定することだけです (幅と高さが半分の画像を読み込むには 2 を使用します。したがって、メモリ使用量は約 1/4 になります)。したがって、あなたの場合、サムネイルのサイズに応じて適切なダウンサンプル係数を計算し、ダウンサンプルされた画像をロードするだけです。

// (continuing from previous block of code)    

// Calculate downsample factor
options.inSampleSize = /* calculate downsample factor here as appropriate */

// Load a downsampled bitmap according to factor calculated above
options.inJustDecodeBounds = false;
Bitmap myBitmap = BitmapFactory.decodeResource(res, resId, options);

また、リストがスクロールする場合は、画面に表示されなくなったビットマップを解放する賢明な戦略を実装する必要があります。この手法と組み合わせると、これはおそらくあなたの問題を解決するはずOutOfMemoryErrorです。

詳細については、Android Training のこのクラスをご覧ください。このクラスでは、アプリがビットマップを適切に読み込み、表示、処理していることを確認するためのこれらの (およびその他の多くの) 便利なヒントを紹介しています。

http://developer.android.com/training/displaying-bitmaps/index.html

于 2012-04-12T15:21:43.587 に答える