我的活动有listview和(除了所有其他东西)从web加载图像并在listview中显示它们。我可以访问5个Android设备:2个HTC欲望,LG P-350,一个手机和平板电脑。通常,一切正常,但是在HTC的一个愿望上启动,应用程序往往会崩溃NullPointerException,这是由于内存不足错误(我猜是这样),这是输出:
05-03 14:41:23.818: E/dalvikvm(843): Out of memory: Heap Size=7367KB, Allocated=4991KB, Bitmap Size=16979KB
稍后,logcat输出堆栈的nullpointerexception跟踪,其中我的一个静态变量突然变为null(该变量在app的根活动中初始化,在整个应用程序中使用,并且肯定在代码中无效)。我想,由于缺乏记忆,它被系统取消了。 据我所知,系统尝试分配大小为17mb的位图 - 我确定加载的图像不能那么大。它们是100 * 70 jpegs,其中任何一个重量远远小于1mb。 我不明白的另一件事是为什么我只在一台设备上出现此错误 - 其他设备工作正常。
在我看来,这看起来很奇怪,我找不到任何线索,我需要建议。
答案 0 :(得分:2)
原因很简单:内存不是按照说法保存你的JPG数据,而是它的解压缩等价物,不用说,它比源文件需要更多的RAM空间......注意这17 MB的限制适用于所有加载的位图,不一定是单个位图。
我不得不在我的一个程序(用于Mapquest Android API MapView对象的自定义Tile加载器)中遇到类似的问题,我最终必须尽可能调用我的位图的recycle()
方法,如以及使用System.gc()
...
很抱歉不能成为最佳新闻的承载者......
您可以使用与我相同的策略解决您的问题:我实际上将加载的位图缓存在硬存储器(例如外部SD卡)中,并在需要时即时重新加载它们,而不是试图将所有内容保存在RAM中。