Android 内存不足错误:巨大位图

Android 内存不足错误:巨大位图,android,memory,Android,Memory,我的活动具有listview,并且(除了所有其他内容外)从web加载图像并在listview中显示它们。我有5台安卓设备:2台HTC desire、LG P-350、一部手机和一台平板电脑。正常情况下,一切正常,但在HTC desire上启动时,应用程序往往会因NullPointerException而崩溃,这是由于内存不足错误(我想是的),以下是输出: 05-03 14:41:23.818: E/dalvikvm(843): Out of memory: Heap Size=7367KB, A

我的活动具有listview,并且(除了所有其他内容外)从web加载图像并在listview中显示它们。我有5台安卓设备:2台HTC desire、LG P-350、一部手机和一台平板电脑。正常情况下,一切正常,但在HTC desire上启动时,应用程序往往会因NullPointerException而崩溃,这是由于内存不足错误(我想是的),以下是输出:

05-03 14:41:23.818: E/dalvikvm(843): Out of memory: Heap Size=7367KB, Allocated=4991KB, Bitmap Size=16979KB
稍后,logcat输出nullpointerexception的堆栈跟踪,其中一个静态变量突然变为null(该变量在应用程序的根活动中初始化,在整个应用程序中使用,并且在代码中肯定不会为null)。我想,由于内存不足,系统会将其置空。 据我所知,系统试图分配17mb大小的位图——我确信加载的图像不会那么大。它们是100*70 JPEG格式,任何一种都远远小于1mb。 我不明白的另一件事是,为什么我只在一台设备上出现这个错误——其他设备工作正常


在我看来,这看起来很奇怪,我找不到任何线索,我需要建议。

原因很简单:内存不是每次都保存JPG数据,而是解压后的数据,不用说,它比源文件占用更多的RAM空间。。。请注意,此17 mb限制适用于一次加载的所有位图,不一定是单个位图

我不得不在我的一个程序(Mapquest Android API MapView对象的自定义磁贴加载器)中解决类似问题,最后我不得不尽可能调用位图的
recycle()
方法,并手动强制系统使用
system.gc()
在战略位置进行垃圾收集

很抱歉,我不是最好的消息的传递者


您可能会使用与我相同的策略来解决问题:我基本上会将加载的位图缓存在硬存储器中,如外部SD卡,并在需要时动态重新加载,不要试图将所有内容都保存在RAM中。

1图像大小小于1MB,因此如果添加所有图像大小,那么它将是一个足够大的错误,足以导致OutOfMemoryError。顺便说一句:没有系统会将变量置零。您的代码输入了一个
null
,或者变量尚未初始化。唯一可能发生这种情况的变量是那些显式为其创建的变量:弱/软引用。我的listview的组织方式是项目单击启动一个新活动(让它成为活动B)。我在listview的onItemClick中设置断点,在调试模式下运行应用程序,输入listview活动,按listview项,在断点处停止,检查静态变量的值-它不是null。然后我将断点放在B的onCreate中,在那里执行stops,然后检查同一个静态变量的值——它已经为null。这是魔法吗?在listview项click listener和B的oncreate之间没有我的代码。变量在这两点之间的某个地方为空…2 Dharmendra:如果分配所有位图导致OutOfMemoryError,为什么logcat输出“位图大小=16979KB”?难道这不意味着一个位图就有那么大吗?如果崩溃是因为位图太大,那么其他设备上的一切又怎么可能正常呢(其中一个是HTC的另一个愿望)?我认为没有一个标准的最大内存占用大小固定在所有安卓设备上。例如,我自己的HTC Desire运行安卓2.1时,最大占用空间约为17MB,但我的Acer Iconia平板电脑也需要更多资源才能崩溃。任何人都可以通过一些官方文件来证实这一点?注意:您的第二个Desire设备是否运行在完全相同的操作系统版本上?这是一个内核限制,例如dalvik.vm.heapgrowthlimit,它可以在build.prop中更改。在旧设备(或内存不足的设备)上,它被设置为16或24Mb。在最近的设备上,它设置为64Mb。