私はアンドロイドが初めてで、最初の実際のアプリに取り組んでいるので、この質問に回答があった場合、または十分に詳しく説明されていない場合はお詫び申し上げます。Android アプリにビットマップをロードするときに、一般的な OutOfMemoryError が発生しています。私はstackoverflowを検索し、InSampleSizeを使用して各ビットマップのメモリを削減する方法を説明するGoogleチュートリアルを調べました。
アプリをテストして、ビットマップを縮小することでどれだけのメモリが節約されたかを確認したところ、ヒープ サイズがまだ同じ割合で増加していることに気付きました。IE InSampleSize = 8 とビットマップをまったくスケーリングしない (または InSampleSize = 1) を使用すると、ヒープはそれぞれ同じように大きくなります。
上記の両方のスケーリング SampleSizes に対して myImage.getByteCount() を使用して byteCount を出力しようとしましたが、どちらも同一の ByteCounts を持っています。これは予想される動作ですか?画像を縮小しているので、バイト数を減らすべきではありませんか? ビットマップに使用されるメモリが約 8 分の 1 に削減されることを期待していました。何か不足していますか、それとも画像のスケーリングに関する私の理解が間違っていますか? ありがとう。
編集:いくつかのテストを行った後、createScaledBitmapを使用するとメモリが削減されることがわかりましたが、最初に元のビットマップを膨張させてからスケーリングする必要がありました。それが必要なので、これは理想的ではないと思います。最初の方法でこれができると思っていましたが、ヒープダンプによるとそうではありません。
初期コードとヒープ ダンプ:
private static Bitmap decodeSampledBitmap(Resources res, int resId, int width, int height
{
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
options.inPreferredConfig = Config.ARGB_8888;
BitmapFactory.decodeResource(res, resId, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, width, height);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}
更新されたコード (上記と同じで、唯一の違い) とヒープ ダンプ:
private static Bitmap decodeSampledBitmap(Resource res, int ResId, int width, int height)
{
....
Bitmap bitmap = BitmapFactory.decodeResource(res, resId, options);
return Bitmap.createScaledBitmap(bitmap, options.outWidth/options.inSampleSize, options.outHeight/options.inSampleSize, false);
}
私の評判のために画像を投稿することはできませんが、ヒープダンプによると、79.155MB を使用しています。2 番目の手法を使用すると、ヒープ ダンプは 26.912 MB を使用します。