巨型在线图片库 - 如何避免OutOfMemoryError?

时间:2010-05-22 18:44:04

标签: android

对于任何想知道的人,图库都是http://www.spore.com/sporepedia

我的应用程序使用Spore API获取100个最新的创建,然后在GridView中显示它们。有关创作的文本数据很容易存储,但图像存在问题。

据我所知,我可以将图像保存在Hashtable中,也可以在每次查看时抓取它们。这些都不会起作用--Hashtable会快速呈现OutOfMemoryError,并且常量重新加载会导致服务器上的大量负载以及客户端上的大量延迟。

有更好的方法存储图像吗?

1 个答案:

答案 0 :(得分:2)

首先不要一次获得100个,没有办法在网格视图中显示100个图像并使它们具有有用的可见尺寸。异步检索图像并一次获得一个屏幕或一半屏幕。我猜你可以用支持的文本/ UI元素在每个屏幕上显示6到9个尺寸合适的图像,你甚至可以根据手机的屏幕尺寸/分辨率选择要显示的图像数量。所以你应该一次得到9到12张图像。

其次,我不知道这些图像的分辨率是什么,但听起来像“大”。如果API支持,则只接收网格视图的缩略图版本。如果没有,我可能会做的是:当您从API接收图像时,首先创建一个缩小到缩略图所需大小的新图像,该图像将进入网格视图,并将其保留在内存中。然后创建一个缩小到您的“细节”屏幕所需大小的新图像(如果有的话)并将其缓存到SD卡并将其从ram和原始源图像中释放,这可能会发生缩放在一个单独的线程中,以避免它影响您的UI线程的响应性。根据使用模式,我可能还会将缩略图缓存到SD卡中,因此释放他们在onStop / onPause中使用的ram并在onStart / onResume中重新加载它们会很便宜。这听起来像你下载'前100名'或类似的东西。由于我不希望在每个应用程序上使用新的前100名,因此您可以通过将图像和信息缓存到SD卡来节省大量网络流量,并且每次程序运行时只下载新条目。

或者像:

这样的过程

接收图片 - >根据细节尺寸进行缩放 - >缓存详细信息大小 - >将细节大小缩放到适当的缩略图大小 - >在以异步方式缓存缩略图时在gridview中显示缩略图

将使用更少的内存,因为内存中只有1个图像副本,但它会减慢gridview的响应,因为图像必须在显示之前缩放两次。它可能足够快到无关紧要,或者您可以通过在后台生成缩略图时显示大图像(内部缩放)来使用网格视图来玩技巧,在准备好时将网格视图切换到缩略图。你只需要尝试确定它是否足够快。