我正在绘制高度和宽度等于设备屏幕的图像作为Android中的叠加项目 . 但是当图像数量超过应用程序崩溃时出现内存不足错误 - 位图超出VM预算 . 如果我尝试回收它,那么错误来自canvas试图使用回收的位图 . 我需要的是在 Map 上绘制大量图像的最佳方法 . 图像来自服务器,我还需要缓存图像 . 对于缓存目前我在LinkedHashMap中这样做,但我想即使这会产生问题,因为我存储drawable对象 .
有没有在 Map 上使用绘制大型位图的示例?
每个应用程序的内存量都非常有限(通常为16MB,但我看到低至14MB,高达32MB) . 这特定于每个设备上运行的固件 . 可以继承应用程序类以提供对“LowMemory”函数的访问,该函数可以在应用程序使用几乎所有内存时提醒您 .
你不应该对屏幕大小的图像有问题,但要确保它们的尺寸不要太大(尽可能小) .
我还建议检查Eclipse中的内存统计信息,以查看应用程序使用了多少内存(以查看它的增长情况等) .
这个错误是处理 Map 和Android时最烦人的错误之一,你会在SO上找到很多与此问题相关的其他帖子
您可能需要考虑使用 BitmapFactory.Options 类的inSampleSize属性 . 在创建位图对象时,此属性将以2的幂(您决定)重新缩放图像,这将节省内存 . 如果图片的分辨率大于屏幕的分辨率,这应该非常适合您,而不会降低图片的质量 .
BitmapFactory.Options
要将其用于从服务器下载的映像,可以按如下方式使用它:
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在回收内存时是积极的 . 它很快恢复了内存 .
SoftReference
2 回答
每个应用程序的内存量都非常有限(通常为16MB,但我看到低至14MB,高达32MB) . 这特定于每个设备上运行的固件 . 可以继承应用程序类以提供对“LowMemory”函数的访问,该函数可以在应用程序使用几乎所有内存时提醒您 .
你不应该对屏幕大小的图像有问题,但要确保它们的尺寸不要太大(尽可能小) .
我还建议检查Eclipse中的内存统计信息,以查看应用程序使用了多少内存(以查看它的增长情况等) .
这个错误是处理 Map 和Android时最烦人的错误之一,你会在SO上找到很多与此问题相关的其他帖子
您可能需要考虑使用
BitmapFactory.Options
类的inSampleSize属性 . 在创建位图对象时,此属性将以2的幂(您决定)重新缩放图像,这将节省内存 . 如果图片的分辨率大于屏幕的分辨率,这应该非常适合您,而不会降低图片的质量 .要将其用于从服务器下载的映像,可以按如下方式使用它:
另一种方法是使用
SoftReference
对象将HashMap中的每个位图对象包装起来,以便VM回收位图使用的内存,而不是因OOM错误而崩溃 . 缺点是你必须重新加载位图和个人,我觉得VM在回收内存时是积极的 . 它很快恢复了内存 .