我目前正在开发使用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() 不再使用位图。如果您调用recycle()及更高版本 尝试绘制位图,你会得到错误:“画布:试图 使用回收的位图“。
所以我开始在onDestroy()中实现一些recycle()但是我面临着不同的问题:
-onDestroy()不可靠,因为我们不能确定Android会在完全杀死应用程序之前调用它。因此,即使它似乎是清理位图的好地方,也可能发生一个活动在另一个启动时立即被杀死而无法为自己的位图分配内存。
- 有些drawables是通过Java代码声明的,因为我们可以保留对它们的引用,所以它们很容易回收。但是那些通过Xml声明的呢?
这些具体问题导致了主要问题: 如何处理位图以确保在另一个onCreate()之前,我们清理了上一个活动的每个位图?
谢谢!
答案 0 :(得分:0)
您可以使用 finalize()方法执行某些任务 这样,您可以仔细检查内存是否已释放。
<强>的Finalize()强>
finalize()方法是java.lang.Object类的受保护和非静态方法。这种方法将全部可用 您在java中创建的对象。此方法用于执行某些最终操作 在删除对象之前对其执行操作或清理操作 从记忆中。你可以覆盖finalize()方法来保留它们 在销毁对象之前要执行的操作。这是 finalize()方法的一般形式。
示例
@Override
protected void finalize() throws Throwable
{
System.out.println("From Finalize Method");
}
另一种方式
另一种实现方式是downsampling和caching位图。如果缓存是有效的,那么你可以在onstart()和onStop()方法上辅助和释放位图。所以你可以在活动失焦时释放内存。