我查看了一些关于延迟加载的帖子,但我相信我的问题有点不同。
我有一个画廊(我的类(class)扩展了画廊),它显示 20 张相当大的图像(每张 400-500K)。我无法将它们全部加载到图库中,因为我遇到了 OutOfMemory 异常。
因此,我创建了一个包含 20 个 Drawable 的数组,并最初填充了前 9 个元素(图像来自网络),并将其余所有元素设置为 null。我的 Intent 是:向右一甩,获取元素编号。 10 并设置为空元素编号。 0. 在另一次向右滑动时获取元素编号。 11 并设置为空元素编号。 1 为空。左撇子的逻辑相同。
问题是我可以比获取元素快得多。 我的图库有一个 BaseAdapter,它的 getView() 看起来像这样:
public View getView(int position, View convertView, ViewGroup parent){ ImageView imageView = new ImageView(); imageView.setDrawable(imageArray[position]; .... .... return imageView; }
我如何告诉 getView() - 如果 imageArray[position] 仍然为 null,显示一个“正在加载...”对话框,一旦它被设置重复你自己的相同位置?
我不想看到 imageView 为空然后即时设置。我希望在设置 imageView 之前根本看不到它。
谢谢。
最佳答案
Gallery 旨在提供流畅的体验。如果您挡住屏幕并且在获取下一张图像之前不切换到下一张图像,那将是非常糟糕的 UI。这样用户将根本无法 throw 。您应该在加载时显示一些加载指示器而不是图像。
我认为您的情况很常见。您应该下载图像并显示它们。如果出现 OutOfMemory,您可以尝试对图像进行 super 采样 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 适配器,但您可以将其应用到图库中并稍作修改。我认为它会完全满足您的需求。
关于Android:在图库中延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3181728/