在Android 2.3.3中清除活动的所有位图的有效方法

时间:2016-07-07 14:10:41

标签: android memory bitmap out-of-memory android-2.3-gingerbread

我目前正在开发使用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声明的呢?

  • 有没有办法找到视图的所有BitmapDrawable(不查看完整视图树)?
  • Android如何管理XML声明的drawable?是否只有一个java对象/ xml对象? (意味着如果在多个视图/活动中使用xml引用,则可能会出现一些问题) 每个对象只有一个实例会大大减少使用的内存,但需要更多的逻辑才能正确清理。

这些具体问题导致了主要问题: 如何处理位图以确保在另一个onCreate()之前,我们清理了上一个活动的每个位图?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用 finalize()方法执行某些任务 这样,您可以仔细检查内存是否已释放。

  

<强>的Finalize()
  finalize()方法是java.lang.Object类的受保护和非静态方法。这种方法将全部可用   您在java中创建的对象。此方法用于执行某些最终操作   在删除对象之前对其执行操作或清理操作   从记忆中。你可以覆盖finalize()方法来保留它们   在销毁对象之前要执行的操作。这是   finalize()方法的一般形式。

示例

        @Override
         protected void finalize() throws Throwable
         {
              System.out.println("From Finalize Method");
          }

另一种方式
另一种实现方式是downsamplingcaching位图。如果缓存是有效的,那么你可以在onstart()和onStop()方法上辅助和释放位图。所以你可以在活动失焦时释放内存。