首页 文章

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

提问于
浏览
2

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

有没有在 Map 上使用绘制大型位图的示例?

2 回答

  • 0

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

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

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

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

  • 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在回收内存时是积极的 . 它很快恢复了内存 .

相关问题