【问题标题】:Android: lazy loading in GalleryAndroid:图库中的延迟加载
【发布时间】:2010-07-05 19:24:57
【问题描述】:

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

我有一个画廊(我的课程扩展了画廊),它显示了 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。

谢谢。

【问题讨论】:

标签: android lazy-loading image-gallery image-loading


【解决方案1】:

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

我认为您的情况很常见。您应该下载图像并显示它们。如果你得到 OutOfMemory,你可以尝试对图像进行超级采样 Strange out of memory issue while loading an image to a Bitmap object

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

你可以看看我的示例代码Lazy load of images in ListView。实际上它是一个 ListView 适配器,但您可以将它应用到画廊,只需稍作修改。我认为它会完全满足您的需求。

【讨论】:

  • "你应该在加载时显示一些加载指示器而不是图像。"我如何实现这一目标?我知道如何在画廊前面的 ProgressDialog 中放置加载指示器,但是如何放置指示器而不是图像本身?提醒您一下,imageView 是在运行时创建的。如果它是在 XML 中定义的,我可以为它分配一个默认源,但这里不是这种情况......谢谢。
  • 这不是问题。您可以在运行时创建 ProgressControl 而不是 ImageView。或者您可以在运行时创建 ImageView 并在下载真实图像时显示一些存根图像。我在示例代码中显示存根图像。
  • 如果我想在异步获取图像时显示进度指示器图标而不是默认存根图标怎么办?请帮帮我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多