【问题标题】:Memory manegment problem with downloaded images on androidAndroid上下载图像的内存管理问题
【发布时间】:2011-03-29 18:32:06
【问题描述】:

我正在开发的应用程序有一点问题。该应用程序显示了一个画廊,其中显示了 1 到 70 多张图片(一次一张),所有图片都是从网络下载的。

一开始我保存一张低分辨率图片,下载完所有低分辨率图片后,我开始下载高分辨率图片并替换它们。

当我开始下载高 dpi 的时候,问题就来了。下载一些后,我得到一个 memoryOutOfBoundsException(这是可以预料的)。


为了解决 android 中的这类问题,我看到了四个选项:

1.- 使用安卓缓存管理器。

这仅限于 Web 视图(所以我不能使用它们)。

2.- 每次用户通过图片时加载高分辨率图片。

这将使每次用户更改图片时都会出现分辨率不佳的图片,直到下载并切换高分辨率图片(正在加载到后台)。让应用看起来很糟糕。

3.- 创建某种可以容纳 5 张图片的 RAM 缓存,并使用类似于第二种方法的东西。

在这种情况下,我会尝试在 ram 中保存最接近正在显示(已下载或正在下载)的 5 张高分辨率图片,以便应用程序可以显示这些图片的高分辨率图片在用户看到低分辨率图片后,无需下载它们就可以在所选图片附近。

4.- 创建个人缓存管理器

在这种情况下,我将创建一个个人缓存管理器,将图片保存在 SD 卡上并在图库中使用这些图片。这也带来了一个问题,我将取决于设备上是否有 SD 卡的用户。为了解决删除应用后文件在设备上的问题(如果应用被删除),我将删除应用的 onDestroy() 方法中的所有文件(我不介意再次加载它们) )。


在我看来,最好的选择是第四个。方法,这迫使我依赖拥有 SD 卡的用户。

现在我的问题。

还有其他方法可以解决我的问题吗?

设备上是否还有其他类型的内存可以用来规避对 SD 卡的依赖?追问。是否建议使用这种内存或使用它会带来其他问题? (另外,关于它的教程将不胜感激。)

用户通常有 SD 卡还是第四个选项最差?

提前谢谢你。

【问题讨论】:

    标签: android


    【解决方案1】:

    我会编写自己的缓存管理器。如果用户只能将图片加载到列表中的左侧和右侧,如果可能的话,我会将这三个保存在内存中,并在每次用户导航到新图片时转移。我不确定这是否是您的应用程序的工作方式,但这是一种方法。如果您无法预测用户的下一个选择,也许有一个循环缓存并尝试一次可以在内存中保存多少个(不知道文件大小的最佳、最差和平均情况,我真的不能说太多关于那个)。

    您可能已经知道这一点,但始终值得一提。当你使用位图时,任何时候你完成了......真正完成它(例如从缓存中刷新它),调用它的回收方法。这似乎是为系统回收内存的最快和最广泛接受的方式。

    【讨论】:

    • 我会试一试,然后告诉你一切顺利。关于回收,是的,你说这样做更好:Botmap bm = downloadBitmap(url); myImageView.setImageBitmap(bm); bm.recycle();myImageView.setImageBitmap(downloadBitmap(url));??
    • 好吧,我认为您不应该在将位图设置到您的视图后立即对其进行回收,尽管您可以进行试验。我的意思是一旦你完成回收它。简单地将其设置为 null 或让它超出范围不会导致 vm 回收内存。因此,假设您的缓存管理器有成员变量或一组 5 个位图,例如,当一个超出范围时,请确保回收它。
    • 效果很好,但有时我不得不显示低分辨率图片(快速滚动时)。我最终做了一些不同的事情。我将图像保存在 ram 上,但是通过以 jpg 格式下载它们(将它们保存在字节数组中)。我只解码我正在展示的那个。这样我就可以下载所有图像并将其存储在 RAM 上而不会出现异常。
    猜你喜欢
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多