我已经回顾了一些有关延迟加载的帖子,但我相信我的问题有点不同。
我有一个画廊(我的班级扩展画廊),它显示了20个相当大的图像(每个400-500K)。我无法将它们全部加载到库中,因为我得到了OutOfMemory异常 所以,我创建了一个包含20个Drawables的数组,最初填充了前9个元素(图像来自Web)并将所有其余元素设置为null。我的意图是这样的:向右倾斜,获取元素号。 10并设置为null元素号。在另一个fling到右边的fetch元素没有。 11并设置为null元素号。 1到null。抛弃左边的逻辑相同。
问题是我可以比提取元素快得多。 我的画廊有一个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,则显示“loading ...”对话框,一旦设置完成,重复自己的位置相同?
我不想看到imageView为空,然后动态设置。我希望在设置之前根本看不到imageView。
感谢。
答案 0 :(得分:6)
Gallery旨在提供流畅的体验。如果您阻止屏幕并且在获取之前不切换到下一个图像,那将是非常糟糕的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适配器,但你可以通过微小的修改将它应用到图库。我认为它将完全符合您的需求。