计算手机上剩余的可用空间:
long freeMemory = (Runtime.getRuntime().maxMemory()) - (Debug.getNativeHeapAllocatedSize());
其中,
Runtime.getRuntime().maxMemory() - 返回堆内存的总限制大小(以字节为单位)。
Debug.getNativeHeapAllocatedSize() - 返回应用程序已使用的数据量(以字节为单位)。
按照以下公式计算正在使用的位图大小:
long Bytes_allocated = (图像高度)*(图像宽度)* 4;
将freeMemory
和Bytes_allocated
进行比较,以选择适合您应用程序的大小。
到目前为止,我还没有找到任何可靠的方法来处理图像大小与可用内存之间的关系。问题在于内存很快变得分散,因此您可能有10 MB的空闲空间,但没有2 MB图像的连续空间。真正需要的是最大空闲空间的大小,但似乎没有任何方法可以获得它。更好的方法是对内存进行碎片整理,但也没有这样的功能存在。
但如果您的可用内存小于图像,则可以确定如果尝试使用它,您将会崩溃,因此至少在使用之前检查一下是有一定价值的。
随着2012年末平板电脑现在具有1920x1280分辨率,我们现在需要20MB的连续内存来存储单个背景图像!看起来其中一些平板电脑现在允许堆达到256MB,但是虽然增加更多的VM空间似乎可以解决问题,但我们真正需要的是一个内存碎片整理器或者一种保留空间的方法。
如果图像大小未经缩放或修改,并且每个更改的图像都具有相同的大小,并且您将应用程序限制为Android 3.0+,则有一个技巧可能有所帮助:
Options opt2 = new BitmapFactory.Options();
opt2.inBitmap = mBitmap; // reuse mBitmap to reduce out of memory errors
mBitmap = BitmapFactory.decodeResource(getResources(), myDrawable, opt2);
这将重复使用相同的内存区域mBitmap来存储图像。