尽管执行了回收,但是Bitmaps和OutOfMemoryError

时间:2012-01-19 05:27:29

标签: android bitmap

我正面临一个我似乎无法找到问题的问题。

在我的视图中,我有一个动态添加的客户视图的LinearLayout,其背景是ImageView(使用来自点火库的RemoteImageView实现,从URL下载图像并将其显示在ImageView中)。我试图为平板电脑和手机优化这些图像,因此我将最大宽度缩放到800px,同时保留了宽高比。

有关活动如何显示的示例:http://imgur.com/O6eur

它基本上是ScrollLayout> LinearLayout>最多可以使用ImageView背景动态添加自定义视图。

图像宽度最大为800px,因此如果是肖像图像,高度可能会更高。这些绝不是小图片。

这些图像在首次开始活动时加载正常。但是,如果我退出此活动,并使用这些图像中的任何一个输入另一个活动,我将面临与BitmapFactory.decodeByteArray()

的OutOfMemoryError

这很奇怪,因为我确实在位图上调用了回收,事实上我在Logcat中显示了它。

在启动应用程序时:继承人GC:

  

01-19 13:20:59.430:D / dalvikvm(30793):GC_CONCURRENT释放<1K,2%   免费17969K / 18311K,暂停1ms + 2ms

所以你可以看到它有大约17969k免费。

在输入活动时,堆增长:

01-19 13:22:26.090:D / dalvikvm(30793):GC_CONCURRENT释放&lt; 1K,3%free 45812K / 46983K,暂停2ms + 19ms

现在它使用45812K。

当我退出(我在onPause上完成()时,我从所有的图像视图中回收位图,内存转向:

01-19 13:23:30.150:D / dalvikvm(30793):GC_EXPLICIT释放26999K,60%免费19170K / 46983K,暂停8ms + 20ms

我们降到了19170K。

我应该再次输入活动,它会因OutOfMemoryError而崩溃。现在的问题是,我正在使用最新的手机(三星Galaxy S2)进行测试,我希望我的应用程序可以在内存较小的旧手机上运行,​​而且我确信它不会支持那么多的内存。现在有。

我想知道如何在不担心OutOfMemoryError的情况下显示尽可能多的图像?我之前曾假设使用RemoteImageView会缓存Bitmaps(https://github.com/kaeppler/ignition),但我错了,我仍然面临着这个问题。我该怎么做才能防止这种情况发生?谢谢。

1 个答案:

答案 0 :(得分:0)

您必须编写虚拟滚动。你应该在内存中只显示图像并处理重新定位小部件的滚动事件并将新图像加载到内存中。