2011-03-29 38 views
0

我正在处理的应用程序有点问题。该应用程序显示一个画廊,显示1到70以上的图片(一次一个),全部从网上下载。在android上下载图片时的内存管理问题

起初我保存一张低分辨率图片,当我完成下载所有低分辨率图片后,我开始下载高分辨率图片并将其替换。

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


为了解决这类问题在Android中我看到四个选项:

1 .-使用机器人缓存管理器。

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

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

这将使每当用户更改图片时出现错误的分辨率图片,直到高分辨率图片(在后台加载)下载并切换。使应用程序看起来很糟糕。

3.-创建一些类似的RAM缓存,可以像5张图片一样保存,并使用类似于第二种方法的东西。

在这种情况下,我会尝试在内存中显示最接近正在显示的5个hi res图片(下载或下载),以便应用程序可以显示hi res图片那些在用户看到低分辨率图片之后没有下载它们的选择附近的那些。

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

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


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

现在我的问题。

有没有其他解决我的问题的方法?

设备上是否有另外一种内存可以用来逃避SD卡的依赖?在问题之后。建议使用这种内存还是使用它会带来其他问题? (另外,关于它的教程可能会有所推测。)

用户通常是否有SD卡,或者是第四个选项是最差的吗?

预先感谢您。

回答

0

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

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

+0

我会试试看,并告诉你它走了。关于回收,你说它更好做: 'Botmap bm = downloadBitmap(url); myImageView.setImageBitmap(BM); bm.recycle();' than 'myImageView.setImageBitmap(downloadBitmap(url));'?? – 2011-03-29 22:28:21

+0

好吧,我认为您不应该在将它设置为您的视图后立即回收位图,尽管您可以尝试。我的意思是一旦完成就回收它。简单地将其设置为空或让它超出范围不会导致vm回收内存。因此,假设您的缓存管理器具有成员变量或5位图阵列,例如,当一个超出范围时,请确保对其进行回收。 – Rich 2011-03-29 23:35:47

+0

它运行良好,但有时我必须显示低分辨率图片(快速滚动时)。 我最终做了一些不同的事情。我将这些图像保存在内存中,但是通过以jpg格式下载它们(将它们保存在一个字节数组中)。我只解码我正在播放的那个。通过这种方式,我可以下载并在RAM上存储所有图像,而无需获取例外。 – 2011-03-31 06:02:32