【发布时间】:2012-01-19 05:27:29
【问题描述】:
我正面临一个我似乎无法找到根源的问题。
在我的视图中,我有一个动态添加的客户视图的线性布局,其背景是一个 ImageView(使用来自点火库的 RemoteImageView 实现,该库从 URL 下载图像并将它们显示在 ImageView 中)。我尝试为平板电脑和手机优化这些图像,因此我将最大宽度缩放到 800 像素,同时保持纵横比。
有关活动外观的示例:http://imgur.com/O6eur
它基本上是一个ScrollLayout > LinearLayout > 最多可以动态添加大量自定义视图,背景为ImageView。
图像的最大宽度为 800 像素,因此如果是纵向图像,高度可能会更高。 .这些绝不是小图像。
这些图像在活动第一次开始时加载良好。但是,如果我退出此活动,并仅使用这些图像中的任何一个进入另一个活动,我将面临带有 BitmapFactory.decodeByteArray() 的 OutOfMemoryError
这很奇怪,因为我实际上确实在位图上调用了回收,而实际上我这样做是在 Logcat 中显示的。
在应用启动时:这里是 GC 分配:
01-19 13:20:59.430: D/dalvikvm(30793): GC_CONCURRENT 释放
所以你可以看到它有大约 17969k 的免费空间。
在进入活动时,堆增长:
01-19 13:22:26.090: D/dalvikvm(30793): GC_CONCURRENT freed
现在它使用 45812K。
当我退出时(我做一个finish() onPause),我从所有的imageviews中回收位图,内存变成了这个:
01-19 13:23:30.150: D/dalvikvm(30793): GC_EXPLICIT freed 26999K, 60% free 19170K/46983K, paused 8ms+20ms
我们已降至 19170K。
如果我再次进入活动,它将因 OutOfMemoryError 而崩溃。现在的问题是,我正在使用最新的手机(三星 Galaxy S2)来测试它,我希望我的应用程序可以在内存较小的旧手机上运行,而且我确信它不会支持我所支持的那么多内存现在有。
我想知道如何才能显示尽可能多的图像而不用担心 OutOfMemoryError?我之前曾假设使用 RemoteImageView 会缓存位图(https://github.com/kaeppler/ignition),但我错了,我仍然面临问题。我能做些什么来防止这种情况发生?谢谢。
【问题讨论】: