【发布时间】:2016-11-09 21:40:01
【问题描述】:
我目前正在开发使用 Android 2.3.3 且内存很少的嵌入式设备。 GUI 使用了大量的位图,有时我们会看到一些 OutOfMemory 异常,这是由于 Android 没有足够好地处理位图内存以足够快地释放内存以使新活动正确启动。
确切地说,Android 官方文档 (https://developer.android.com/training/displaying-bitmaps/manage-memory.html) 告诉我们:
在 Android 2.3.3(API 级别 10)及更低版本上,支持像素数据 位图存储在本机内存中。它与位图分开 本身,存储在 Dalvik 堆中。本机中的像素数据 内存没有以可预测的方式释放,可能会导致 应用程序短暂超出其内存限制并崩溃。
在 Android 2.3.3(API 级别 10)及更低版本中,使用 recycle() 是 推荐的。如果您在您的 应用程序,您可能会遇到 OutOfMemoryError 错误。回收() 方法允许应用尽快回收内存。
注意:只有在确定 不再使用位图。如果您调用 recycle() 及更高版本 尝试绘制位图,你会得到错误:“画布:试图 使用回收的位图”。
所以我开始在 onDestroy() 中实现一些 recycle() 但我面临不同的问题:
-onDestroy() 不可靠,因为我们不能确定 Android 会在完全杀死应用程序之前调用它。因此,即使它似乎是清理位图的好地方,也可能会发生一个活动在另一个活动启动时立即被终止,并且无法为其自己的位图分配内存。
- 会有更好的地方来实现位图的回收吗?
-一些drawables是通过Java代码声明的,它们很容易回收,因为我们可以保留对它们的引用。但是那些通过 XML 声明的呢?
- 有没有办法找到视图的所有 BitmapDrawable(无需查看完整的视图树)?
- Android 如何管理 XML 声明的可绘制对象?是否只有一个 java 对象/xml 对象? (这意味着如果在多个视图/活动中使用 xml 引用,您可能会遇到一些问题) 每个对象只有一个实例会大大减少使用的内存,但需要更多的逻辑才能正确清理。
这些具体问题导致了主要问题: 如何处理位图以确保在另一个 onCreate() 之前,我们清理了前一个活动的每个位图?
谢谢!
【问题讨论】:
标签: android memory bitmap out-of-memory android-2.3-gingerbread