我在我的应用程序中有很多位图。它们在应用程序启动时加载。在一个活动中,我有两个按钮来更改语言,但是当我点击按钮时,我又开始加载图像。有时我会因为内存不足而出错。我如何清理内存,当我点击按钮时清理内存,然后加载位图?这有可能做到吗?现在我使用system.exit(0)
,但我不想关闭所有应用程序。在android中清理内存
回答
我前段时间面对与图形处理密集型应用程序相同的问题,经过大量调试后,我发现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)缓存和重新使用已加载的位图对象的详细信息。
不要致电System.exit(0)
因为它会终止您的JVM。 完成使用后,请在每个位图上拨打bitmap.recycle()
。这将释放由位图获取的本地内存。同样将位图引用设置为null将使GC在下次运行时收集它。
你会不会得到OutOfMemory异常,如果未使用的位图不是从你的数据结构引用和recycle
被正确地调用。只要你确保这一点,自动垃圾收集器就会开始为你提供可靠的服务,并且你不需要告诉它什么时候释放东西。
小心你程序中的任何静态变量,尤其是集合或复杂结构。如果任何地方添加了位图,请确保它从此处被删除。
- 1. OSGi内存清理
- 2. Android清理/内容视图
- 3. CLLocationManager,MKReverseGeocoder,清理内存
- 4. C(++)和Lua清理内存
- 5. RemoveFromSuperview不清理内存
- 6. C++内存管理澄清
- 7. 墓碑清理内存WP7
- 8. Android内存清除活动
- 9. 在Xamarin.Android中使用位图处理Android内存Android的内存
- 10. 清理内存中的数据库
- 11. window.unload中的Javascript内存泄漏清理
- 12. 如何清理WT中的内存?
- 13. 如何清理内存,而在Python
- 14. 在Xcode4.2内存管理,澄清需要
- 15. 清理Vs的内存回收在.net
- 16. 需要澄清在iPhone内存管理
- 17. 为什么在完成活动后android不清理内存?
- 18. 在android中清理SurfaceView
- 19. 在android中清理活动
- 20. Android中的内存管理
- 21. 在Chrome中清除内存?
- 22. Android内存管理
- 23. Android内存管理
- 24. 在Android上清除内部存储中的文件内容
- 25. 在android中处理内存泄漏
- 26. 在android中如何处理内存?
- 27. 在Android中处理内存问题
- 28. 在android显示器中添加内存在android中的内存管理
- 29. textview在Android 4.0中旋转后清理,但不在Android 2.0和3.0中清理
- 30. Android onActivityResult和onResume生命周期清理后内存不足
[见本](http://stackoverflow.com/a/823966/940096) – Praveenkumar