内存不足错误 - 在地图中使用位图时,位图在Android中超出VM预算?

时间:2011-07-16 12:03:38

标签: android bitmap maps out-of-memory

我正在绘制高度和宽度等于设备屏幕的图像作为Android中的叠加项目。但是当图像数量超过应用程序崩溃时出现内存不足错误 - 位图超出VM预算。如果我尝试回收它,那么错误来自canvas试图使用回收的位图。我需要的是在地图上绘制大量图像的最佳方法。图像来自服务器,我还需要缓存图像。对于缓存目前我在LinkedHashMap中这样做,但我想即使这会产生问题,因为我存储drawable对象。

是否有在地图上使用绘制大位图的示例?

2 个答案:

答案 0 :(得分:2)

您可能需要考虑使用BitmapFactory.Options类的inSampleSize属性。在创建位图对象时,此属性将以2的幂(您决定)重新缩放图像,这将节省内存。如果图片的分辨率大于屏幕的分辨率,这应该非常适合您,而不会降低图片的质量。

要将其用于从服务器下载的图像,可以按如下方式使用:

URL url = new URL(photoUrl);
URLConnection ucon = url.openConnection();

Options options = new Options();
options.inSampleSize = 2;

Bitmap bitmap = BitmapFactory.decodeStream(ucon.getInputStream(),null, options);

另一种方法是使用SoftReference对象将HashMap中的每个位图对象包装起来,这样VM就会回收位图使用的内存,而不是因为OOM错误而崩溃。缺点是你必须重新加载位图和个人,我觉得VM在回收内存时是积极的。它很快恢复了内存。

答案 1 :(得分:0)

每个应用程序的内存量都非常有限(通常为16MB,但我看到低至14MB,高达32MB)。这特定于每个设备上运行的固件。可以继承应用程序类以提供对“LowMemory”函数的访问,该函数可以在应用程序使用几乎所有内存时提醒您。

你不应该对屏幕大小的图像有问题,但要确保它们的尺寸不要太大(让它们尽可能小)。

我还建议检查Eclipse中的内存统计信息,以查看应用程序使用了多少内存(以查看其增长情况等)。

这个错误是处理地图和Android时最烦人的错误之一,你会在SO上找到很多与此问题相关的其他帖子