自定义 ListView 包含多个图片时,出现 Out Of Memory 异常

4
我正在尝试创建一个Android ListView,它看起来像Instagram图片或Facebook的动态。当我加载一些图片后(只有几张),在我的Galaxy Nexus上出现了内存溢出异常。我对它们进行了缩放,但是图片数量不固定,理论上可以无限制地增加。在Facebook和Instagram上,它们加载大量的图片和其他数据,并且运行良好。
你认为呢?我能用原生的Android编程实现这些性能吗?如果我创建一个HTML5 feed(像Facebook和Instagram),我能避免内存问题吗?
对我来说,需要处理来自服务器的图像内存的工作量太大了。如果这是唯一的解决方案,如何管理原生ListView中的数百张图片?
感谢任何意见!谢谢。
1个回答

5
不要一次性将所有图像加载到内存中,只需将需要显示的图像加载到Bitmap对象中;并确保加载的图像仅为您需要显示的大小(不要完全加载1900x1200的图像以显示300x200的缩略图)。您的应用程序堆大小为~30MB(取决于设备,但这是一个好的经验法则),一旦加载,Bitmap将占用Width*Height*4字节的内存。
一种方法是在下载时将图像缓存到磁盘上,以便它们不必在内存中,并始终在下载图像之前检查缓存。您还可以使用缓存将需要在列表中显示的少量图像加载到内存中。
您还可以利用BitmapFactory.Options.inSampleSize选项在加载图像时减小图像的大小,而不是加载整个图像,然后创建一个小副本,这会浪费时间和内存。
希望有所帮助。
请参阅:http://developer.android.com/training/displaying-bitmaps/index.html获取帮助。

我尝试了所有这些方法,但是在列表中的6-8张图像后,应用程序仍然会出现oom异常。 当当前项目需要它们时,我将图像设置在列表中,并且只执行一次。 - Ohadza
1
我没有发布代码,因为我想听听其他人是如何在一个ListView中处理数百张图片的,以及是否可能的。 - Ohadza
我们大多数人都是使用上述描述的方法来做的,所以你代码中一定有什么问题。 - devunwired
你试过用50张以上的图片来尝试这些方法吗?就像Instagram的动态一样? - Ohadza
是的,我们在许多大型应用程序中都做过这个。正如您可能从缺乏其他答案中看到的那样,这是一种常见的做法。 - devunwired

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接