2014-11-24 62 views
1

我收到一个OutOfMemoryError异常,在我的应用程序主屏幕的几次加载后抛出。该应用程序加载关于位置的数据和背景图像。有几个选项可供选择,并且在5-6个不同的位置选择之后,堆超过192 MB,并且出现错误。我相信这些问题归根到底是我的位图使用不当。我的代码很长,也不清楚,所以我会举一个例子,希望有人能帮助我,因为我认为我没有掌握关于图像内存管理的基础知识(我已经阅读过文档并进行了大量搜索,我正在寻找理想实际上与此人交谈)。OutOfMemoryError - 用位图破坏堆大小


我有一个如果有5个条件,每个返回一个不同的图像。 我将图像转换为位图并将其设置为我的主布局的新可绘制源。

然后我再次这样做,相同的功能,但对于不同的位置,不同的图像。

经过几次这样做,所有这些被加载的图像似乎都留在内存中,并堵塞它,导致错误。为了保持它非常简单,我应该在将这些不同的图像加载到我的布局背景之间执行哪些步骤来防止此问题?

+0

192MB远远大于你会在很多手机中得到。通常你会想下降到32MB。幸运的是,这些设备通常具有较低密度的屏幕,因此您不必将尽可能多的像素推到屏幕上。这是一个有用的资源来处理位图:http://developer.android.com/training/displaying-bitmaps/index.html – asdasd 2014-11-24 17:45:19

回答

1

你必须回收位图,你不再使用。确保你同时拥有非常有限数量的Bitmap实例,并且每次完成使用位图调用其“recycle()”方法。

你可以在这里找到更多的信息:Managing Bitmap Memory & Caching Bitmaps

+0

不应该达尔维克照顾,当没有对该位图的引用? – jvrodrigues 2014-11-24 17:44:15

+0

但是什么时候应该召回回收。确实,回收并不是真的有必要了。我试图将它们都设置为null,甚至在暂停,恢复等活动时手动调用GC,但没有真正的改变。 – 2014-11-25 09:31:53

+0

@Twentyonehundred根据上面链接中的信息,直到Android 2.3.3(包括)都需要显式回收呼叫,但对于更高版本不需要。可能是他们改进了垃圾收集算法。至于回收计时 - 建议在不打算使用该位图实例时尽快调用回收。另请参阅这里有关位图缓存的有用阅读:http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html – 2014-11-25 10:25:22