この回答で説明されている方法を使用しています: https://stackoverflow.com/a/6893818/457059
チェックを行う行は次のとおりです。
if ((reqsize + allocNativeHeap + heapPad) >= Runtime.getRuntime().maxMemory())
残念ながら、私はまだ時々 OutOfMemory Exceptions で終わっていました。そのため、デバッグを行ったところ、Galaxy S3 (アイスクリーム サンドイッチ) では、アプリで現在使用されているメモリが上記のアプローチでは考慮されていないことがわかりました。
私の理論では、上記の回答は、画像がネイティブ ヒープに保存されている Android 2.x 以下のみをターゲットにしているということです。
チェックを次のように変更しました。
public static boolean checkBitmapFitsInMemory(long bmpwidth,long bmpheight, int bmpdensity ){
long required=bmpwidth*bmpheight*bmpdensity;
long allocated = Runtime.getRuntime().totalMemory() + Debug.getNativeHeapAllocatedSize() + Tools.getHeapPad();
if ((required + allocated) >= Runtime.getRuntime().maxMemory()) {
return false;
}
return true;
}
これは私の S3 ではうまく機能しますが、正しく機能しているかどうかはまだわかりません。特に、これらのことは私には明らかではありません:
- この質問に対するstackoverflowの回答があるのはなぜですか。これは正しくないのに8倍に評価されましたか?
- 私は Runtime.getRuntime().totalMemory() を使用してアプリの現在使用されているメモリを取得していますが、私の S3 ではうまく機能していますが、totalMemory() の API の説明は、まったく異なることを教えてくれます。実行中のプログラムで使用できるメモリの量。」何故ですか?
- 私のアプローチは Android 2.x でも機能しますか?