2012-06-26 46 views
0

我在我的应用程序中有很多位图。它们在应用程序启动时加载。在一个活动中,我有两个按钮来更改语言,但是当我点击按钮时,我又开始加载图像。有时我会因为内存不足而出错。我如何清理内存,当我点击按钮时清理内存,然后加载位图?这有可能做到吗?现在我使用system.exit(0),但我不想关闭所有应用程序。在android中清理内存

+2

[见本](http://stackoverflow.com/a/823966/940096) – Praveenkumar

回答

4

我前段时间面对与图形处理密集型应用程序相同的问题,经过大量调试后,我发现Bitmap对象没有自动正确释放。

一旦你不再需要它们(比如Activity.onStop方法),你应该通过调用它们的回收方法来自己管理位图。

EDIT(2014年10月8日):

Android的开发者文档终于包含明确explanations for these bitmap memory problems。在此期间,有些事情已经发生了改变,但我们通常仍然需要处理旧的Android版本,这会使位图内存管理变得困难。

下面是关键点:

就Android 2.3.3(API级10)和下

  • 像素数据被存储在本机存储器 ...
  • ...和不是在Dalvik堆内存
  • 像素数据是发布不可预知的方式

的问题出现在你已所剩无几,与位图(或其他大的物体)在Dalvik堆内存的限制,并尝试加载另一个位图。即使您在旧位图对象上不再保留任何引用,也不保证这些位图在之前得到了垃圾回收分配了新的位图对象。因此,您可以随机触及限制并获得OutOfMemoryError

管理的位图对象自己是很重要的。当您完成使用位图时,您应该在加载另一个位图之前调用其方法recycle()

由于Android 3.0(API级11)

  • 像素数据上的Dalvik堆与所述位图对象存储一起

这里的Dalvik的内存管理器可以看到多少内存离开并完全控制回收记忆。

常务位图

在这两种情况下(较旧的Android版本和更新),您可能需要管理自己的位图,以避免对象

  • 同一图像的重复加载(优化问题)
  • 内存不足(稳定性问题)

Android开发人员文档包含有关如何使用least-recently-used cache (LruCache)缓存和重新使用已加载的位图对象的详细信息。

1

不要致电System.exit(0)因为它会终止您的JVM。 完成使用后,请在每个位图上拨打bitmap.recycle()。这将释放由位图获取的本地内存。同样将位图引用设置为null将使GC在下次运行时收集它。

这个答案将帮助您:Catching OutOfMemoryError in decoding Bitmap

1

你会不会得到OutOfMemory异常,如果未使用的位图不是从你的数据结构引用和recycle被正确地调用。只要你确保这一点,自动垃圾收集器就会开始为你提供可靠的服务,并且你不需要告诉它什么时候释放东西。

小心你程序中的任何静态变量,尤其是集合或复杂结构。如果任何地方添加了位图,请确保它从此处被删除。