【问题标题】:Efficient way to clean all bitmaps of an activity in Android 2.3.3在 Android 2.3.3 中清理活动的所有位图的有效方法
【发布时间】: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


    【解决方案1】:

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

    Finalize()
    finalize() 方法是 java.lang.Object 类的受保护的非静态方法。该方法将在所有 您在 java 中创建的对象。此方法用于执行一些最终的 在对象被移除之前对其进行操作或清理操作 从记忆中。你可以重写 finalize() 方法来保留那些 在对象被销毁之前要执行的操作。这是 finalize() 方法的一般形式。

    示例

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      • 2023-03-08
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多