Android 位图内存泄漏?

Android 位图内存泄漏?,android,bitmap,garbage-collection,out-of-memory,recycle,Android,Bitmap,Garbage Collection,Out Of Memory,Recycle,我一直在制作一个菜单系统,模仿ViewFlipper,只是我自己在RootView中重置了图像和文本,试图避免与位图相关的OOM。一切都很顺利,直到昨天,我才意识到在重新启动几次之后,以及随后的视图更改之后,我得到的位图超出了虚拟机预算。。或者类似的东西。我启动了allocation tracker,试图查看哪些电话没有被丢弃,并发现这些电话是我的麻烦源: _stars.setBackgroundDrawable(getResources().getDrawable(R.drawable.sta

我一直在制作一个菜单系统,模仿ViewFlipper,只是我自己在RootView中重置了图像和文本,试图避免与位图相关的OOM。一切都很顺利,直到昨天,我才意识到在重新启动几次之后,以及随后的视图更改之后,我得到的位图超出了虚拟机预算。。或者类似的东西。我启动了allocation tracker,试图查看哪些电话没有被丢弃,并发现这些电话是我的麻烦源:

_stars.setBackgroundDrawable(getResources().getDrawable(R.drawable.star_1));
_button.setBackgroundResource(R.drawable.button_1); 
_image.setImageResource(R.drawable.image_1);
这显然不是所有的代码,但它是跟踪器指向我的许多分配的地方,如下所示:

258 72  android.graphics.BitmapFactory$Options  1 android.graphics.drawable.Drawable
481 68  android.graphics.drawable.BitmapDrawable 1 android.graphics.drawable.Drawable
482 52  android.graphics.Paint  1   android.graphics.Bitmap createBitmap    
479 52  android.graphics.Paint 1 android.graphics.drawable.BitmapDrawable$BitmapState
255 36  android.graphics.Bitmap 1   android.graphics.BitmapFactory      
254 36  android.graphics.Canvas 1   android.graphics.Bitmap createBitmap    
250 36  android.graphics.Bitmap 1   android.graphics.Bitmap nativeCreate    
123 36  android.graphics.Bitmap 1   android.graphics.BitmapFactory
我想知道的是,这正常吗?或者我在什么地方有漏洞吗?在测试后,我的分配中至少有10-20个漏洞,最终不可避免地我碰到了OOM。除了使用位图变量,然后可能使用Bitmap.recycle(),不确定如何处理此问题,但这涉及检查视图是否仍在使用,以及是否在错误的时间循环使用;因此我不是一个粉丝。我只是在寻找一种方法,每次退出视图时都会终止所有这些分配。(已经尝试将控件设置为null onPause()&onDestroy(),希望它们释放对位图的引用,从而能够对它们进行GC,但没有用)

[编辑]


从那以后,我读到当你的活动结束时,可以根据需要处理拖拽物。所以我不应该给他们打电话,是吗?至于单个位图的大小,它只是一个图像(480w x 720h(x4bpp/8))/1024=~169KB,所以这似乎不是问题。

超过虚拟机预算并不一定意味着存在泄漏。我试图加载一个位图,但这个位图太大了,导致了同样的问题。此外,如果删除引用,它可能不会立即执行GC,并且可能仍然会耗尽内存。
您可能需要调用
.Recycle
,因为我不认为有什么方法可以在需要时强制GC运行,但是
Recycle
将在运行位图时释放位图持有的本机引用,这样您就不必等待GC了。

我添加了一些编辑,这些编辑可以解决您所说的问题,而不必在这里执行。