5

我已经查看了一些关于延迟加载的帖子,但我相信我的问题有点不同。

我有一个画廊(我的课程扩展了画廊),它显示了 20 张相当大的图像(每张 400-500K)。由于出现 OutOfMemory 异常,我无法将它们全部加载到库中。
因此,我创建了一个包含 20 个 Drawable 的数组,并最初填充了前 9 个元素(图像来自 Web),并将其余所有元素设置为 null。我的意图是这样的:向右一晃,获取元素号。10 并设置为空元素编号。0. 在另一次向右获取元素编号。11 并设置为空元素编号。1 为空。左转也是同样的逻辑。

问题是我可以比获取元素快得多。我的画廊有一个 BaseAdapter,它的 getView() 看起来像这样:

public View getView(int position, View convertView, ViewGroup parent){
     ImageView imageView = new ImageView();
     imageView.setDrawable(imageArray[位置];
     ……
     ……

     返回图像视图;
}

我如何告诉 getView() - 如果 imageArray[position] 仍然为空,则显示“正在加载...”对话框,一旦设置好,就在相同的位置重复自己?
我不想看到 imageView 为空,然后即时设置。我希望在设置之前根本看不到 imageView。

谢谢。

4

1 回答 1

6

Gallery 专为流畅体验而设计。如果您阻止屏幕并且在获取下一张图像之前不切换到下一张图像,这将是非常糟糕的 UI。这样用户将根本无法投掷。您应该在加载时显示一些加载指示器而不是图像。

我认为您的情况很常见。您应该下载图像并显示它们。如果你得到 OutOfMemory 你可以尝试对图像进行超采样将图像加载到 Bitmap 对象时出现奇怪的内存不足问题

如果仍然存在 OutOfMemory,您应该从内存中删除位图并将它们缓存到 SD。因此,当用户回退时,您可以再次从 SD 加载图像,它会足够快。并且内存消耗会更低。正如您所建议的,您可以将 10 个最近的图像缓存在内存中,而将其他图像缓存在 SD 中。

您可以查看我的示例代码在 ListView 中延迟加载图像。实际上它是一个 ListView 适配器,但您可以将它应用到画廊,只需稍作修改。我认为它会完全满足您的需求。

于 2010-07-05T23:39:53.597 回答