【问题标题】:OutOfMemoryError because of not deleting previous bitmapsOutOfMemoryError 因为没有删除以前的位图
【发布时间】:2012-07-13 21:52:42
【问题描述】:

在我的 Android 应用中,当我第二次运行我的一项活动时,我会收到一个 OutOfMemoryError。我想我需要在活动运行时第一次删除位图。但我不知道我该怎么做。谢谢。

【问题讨论】:

  • 由于您没有提供足够的信息,因此无法说出您应该做什么/如何做。在Bitmap 类中阅读方法recycle - 也许,这就是你所追求的。
  • 参考这篇文章它会帮助你stackoverflow.com/questions/11410027/…

标签: android out-of-memory


【解决方案1】:

尝试从代码中读取位图。将位图放在 res/drawable-hdpi 文件夹中。 (不同的图像质量有不同的文件夹)。在代码中设置位图字段:

Bitmap alpha;
Bitmap foo;

现在在 onResume() 中初始化位图:

Options options = new Options();
alpha = BitmapFactory.decodeResource(game.getResources(), R.drawable.youBitmapName, options);
foo = BitmapFactory.decodeResource(game.getResources(), R.drawable.youBitmapName2, options);

选项将使您能够进行下采样。 (我不确定您的图像有多大,但您可能还想使用缩放方法)。

在onPause中,通过调用清理资源:

alpha.recycle();
alpha = null;
foo.recycle();
foo = null;

一旦调用 onResume() 方法,位图就会重新初始化。

【讨论】:

  • 我还将代码加载到 try...catch 块中,如果抛出 outofmemoryerror 捕获它并在重试或放弃之前调用 System.gc()。
【解决方案2】:

通常,一旦没有更多引用指向该实例,垃圾收集器就会调用 Bitmap.recycle()

如果您想“强制”清理位图,请自行致电recycle()

但我建议先查找内存泄漏。

【讨论】:

    【解决方案3】:

    清空您的位图并调用垃圾收集器:System.gc(); 和/或 Runtime.getRuntime().gc();

    还请提供有关您的代码的更多详细信息以获得更好的答案。

    【讨论】:

    • 我应该在 onPause() 方法中这样做吗?
    • 是的,你可以。你也可以叫它onResume()。这取决于您的代码。
    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2021-12-25
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    相关资源
    最近更新 更多