我正在为 Android Honeycomb 编写一个非常占用内存的应用程序,并且我一直非常小心recycle()
未使用Bitmap
的 s ;事实上,这对于应用程序的工作来说是必要的,因为Bitmap
s 不断地循环进出内存。但是,我刚刚onConfigurationChanged()
在.Activity
onStop()
目前我的onStop()
方法:
- 设置一些
View
s 以显示默认值Drawable
; - 调用
recycle()
这些Bitmap
s 以前使用的View
s; - 对 s 的引用无效
Bitmap
。
不幸的是,使用 Eclipse 内存分析器,这似乎对内存使用没有任何影响。
正如您所想象的那样,在以一种名义上的垃圾收集语言为释放资源付出了如此多的努力后,我希望能有更多的效果。所以我的问题是:做recycle()
什么?它是否真的触发了垃圾收集,或者系统会保留内存——即使你调用了——System.gc()
直到它觉得需要摆脱一些东西?
注意我知道Bitmap
s 实际上并没有保存在常规堆中,但我认为调用recycle()
足以确保它们从本机堆中删除。
部分答案
我发现如果 anImageView
包含Bitmap
已回收的 a ,则Bitmap
数据仍保留在内存中,直到setImageBitmap(null)
在ImageView
. 如果setImageResource(...)
或被setImageDrawable(...)
调用,甚至可能是这种情况(它们是加载在一个相对较小的九个补丁中 - 但是,MAT 分析表明这并没有删除Bitmap
包含在私有成员中的大ImageView
)。简单地调用这个函数onStop()
已经从我们的应用程序的堆中剔除大约 10MB。不过,显然这可能不适用于 Android 的预蜂窝版本。