【发布时间】:2011-10-22 15:19:01
【问题描述】:
我一直在制作一个模仿 ViewFlipper 的菜单系统,只是我自己重置了 RootView 中的图像和文本,试图避免与位图相关的 OOM。一切都很顺利,直到昨天我意识到在几次重新启动和随后的视图更改后,我会得到 Bitmap Exceeds VM budget.. 或类似的东西。我启动了分配跟踪器并试图查看没有被转储的内容,并发现这些调用是我的麻烦之源:
_stars.setBackgroundDrawable(getResources().getDrawable(R.drawable.star_1));
_button.setBackgroundResource(R.drawable.button_1);
_image.setImageResource(R.drawable.image_1);
这显然不是所有代码,但它是跟踪器指向我的 MANY 分配的地方,如下所示:
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 变量和 Bitmap.recycle() 之外,不知道如何处理这个问题,但这涉及检查视图是否仍在使用以及可能在错误的时间回收;因此我不是粉丝。我只是在寻找一种方法来在每次退出视图时终止所有这些分配。(已经尝试将控件设置为 null onPause() 和 onDestroy(),希望他们会释放对位图的引用,因此能够将它们 GC 到 NO AVAIL)
[编辑]
我已经读过here,当您的活动完成时,Drawables 会根据需要进行处理。因此,我不应该对它们调用回收吗?至于单张Bitmap的大小,就是一张图片(480w x 720h (x4bpp/8))/1024 = ~169KB,所以好像没有成为问题。
【问题讨论】:
标签: android bitmap garbage-collection out-of-memory recycle