【发布时间】:2011-12-12 18:26:57
【问题描述】:
我正在为Android Honeycomb 编写一个非常占用内存的应用程序,并且我一直非常小心recycle() 未使用的Bitmaps;事实上,这对于应用程序的工作来说是必要的,因为Bitmaps 不断地循环进出内存。但是,我刚刚在Activity 中实现了onConfigurationChanged(),因此(出于多种原因)我试图将内存释放例程放在onStop() 中。
目前我的onStop() 方法:
- 设置一些
Views 以显示默认Drawable; - 在这些
Views 以前使用的Bitmaps 上调用recycle(); - 空引用
Bitmaps。
不幸的是,使用 Eclipse 内存分析器,这似乎对内存使用没有任何影响。
正如您所想象的那样,在以一种名义上是垃圾收集的语言来释放资源方面付出了如此多的努力,我本来希望能产生更多的效果。所以我的问题是:recycle() 是做什么的?它是否真的触发了垃圾回收,或者系统会保留内存——即使你调用System.gc()——直到它觉得需要摆脱一些东西?
注意,我知道 Bitmaps 实际上并没有保存在常规堆中,但我认为调用 recycle() 足以确保它们从本机堆中删除。
部分答案
我发现如果ImageView 包含已被回收的Bitmap,则Bitmap 数据仍保留在内存中,直到在ImageView 上调用setImageBitmap(null)。如果调用了setImageResource(...) 或setImageDrawable(...),甚至可能是这种情况(它们是在一个相对较小的九个补丁中加载的——但是,MAT 分析表明这并没有删除大的Bitmap,它包含在私有ImageView 的成员)。只需在onStop() 调用此函数即可从我们的应用程序堆中剔除大约 10MB。不过,显然这可能不适用于 Honeycomb 之前的 Android 版本。
【问题讨论】:
-
我有。实际上,我单步执行了回收它们的代码,并在调试器中检查了
isRecycled(),它返回了true。 -
哦,我明白你的意思了,对不起。 (漫长的一天。)我的意思是,现在或将来某个时候,当 Android 感觉像它时,内存会被释放吗?
标签: android memory bitmap android-3.0-honeycomb recycle