多屏幕更改中的位图OutOfMemory

时间:2010-08-10 05:08:54

标签: android memory-leaks

我有一个位图,我从SD卡加载,允许用户选择要显示的图片。创建位图后,我在ImageView中设置了位图:

mBitmap = Bitmap.createBitmap(Media.getBitmap(this.getContentResolver(), mPictureUri));
mImageView.setImageBitmap(mBitmap);

这很好用。但是,如果我将屏幕方向从纵向更改为横向,并再次返回几次,我总会得到OutOfMemory异常。

在onPause中,我调用mBitmap.recycle(),然后在onResume上,我再次调用上面的代码来创建位图并设置ImageView。由于我每次都在回收图像,我怎样才能得到OutOfMemory错误?

在任何情况下,由于失败,我发现一个帖子说要尝试使用onRetainNonConfigurationInstance()和getLastNonConfigurationInstance()。见帖子Save cache when rotate device。我改变了我的代码以这种方式工作,我仍然得到一个错误。更改代码,我在onCreate()中调用了getLastNonConfigurationInstance(),并删除了onPause和onResume中的所有代码。

有人可以告诉我问题是什么,或提供一些方法来简单地加载图像,然后能够暂停和恢复活动而不会耗尽内存吗?感谢。

2 个答案:

答案 0 :(得分:1)

尝试减小位图的大小。它有多大?使用BitmapFactory.options。 而不是使用“这个实例”。请参阅有关内存泄漏的文章: http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html

答案 1 :(得分:0)

内存泄漏可能是由于持有上下文实例,而上下文实例又包含对Activity中所有对象的引用,然后才会销毁它。 这篇文章解释得更好。

你应该减少图像的大小,因为每个应用程序有16MB,如果你重新创建大的位图,它们可能会在垃圾收集之前累积到16MB或者有内存泄漏。