約 4.19 MB (ディスクのサイズ) の画像 (3648x2736) があり、それをアプリケーションにロードしたかったのですが、十分なメモリがないためにクラッシュしました。したがって、この種のクラッシュを回避するために、画像をデコードする前にバリデーターを配置します (いいえ、サイズを小さくするために使用したくありませんinSampleSize
)。
long maxMemory = Runtime.getRuntime().maxMemory();
long nativeUsage = Debug.getNativeHeapAllocatedSize();
long heapSize = Runtime.getRuntime().totalMemory();
long heapRemaining = Runtime.getRuntime().freeMemory();
long memoryLeft = maxMemory - (heapSize - heapRemaining) - nativeUsage;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, options);
int bitmapSize = options.outHeight * options.outWidth * 4;
if (bitmapSize < memoryLeft)
return BitmapFactory.decodeFile(filePath);
ここで確認したいことの 1 つは、bitmapSize
正しく計算できているかどうかです。画像ファイルのサイズが 4.19 MB しかなくmemoryLeft
、8 MB を超えていたため、アプリがクラッシュしました。つまり、すべてのピクセルを 4 バイト (PNG) として保存していますよね? jpegの場合は3バイトではないでしょうか?または、他に知っておくべきことがありますか?