2

我有一个程序从画廊加载位图(通过调度结果意图),然后显示图像。然后在离开显示图像的活动时,我调用bm.recycle(). 但这似乎并没有回收位图?我知道这一点是因为这里的帖子中描述的问题:android bitmap out-of-memory error after getting same image at a row two

这个问题具体如本标题所述:为什么 onDestroy 不回收位图?(我只提供某些上下文的链接,而不是分散注意力)

这是我的 onDestroy:

@Override
protected void onDestroy() {
    super.onDestroy();
    unbindDrawables(findViewById(android.R.id.content).getRootView());
    System.gc();
    myImage.recycle();
    myImage = null;
}
4

2 回答 2

3

您可能在某个地方有一个您忘记释放的参考。另请参阅有关How to find Memory Leak Class/Activity in Android 的答案。我相信它将帮助您快速找到泄漏内存的位置。

还要记住,你必须自己释放内存。回调onDestroy()不会为您执行此操作。


首先,您需要安装MAT 插件。重新启动后单击转储 HPROF 文件

设备控制

大约30秒后。您将看到一个对话框,您可以在其中单击完成。比你得到这个观点:

转储结果

在那里,您左键单击最大的部分并使用传出引用进行过滤。然后你在这里得到这个视图:

在这里,您可以看到我错过了删除 ContentManager 中的项目,其中有几个项目存储在我的pending HashMap中。

于 2013-04-26T19:38:29.387 回答
2

查看Android Activity Lifecycle,它显示了应该使用哪些方法来创建和释放资源。说明对应的函数onCreate()不一定onDestroy()是因为开发者不知道Android OS什么时候会调用onDestroy()

答案

因此,在您的特定情况下,您可以 free 或recycle()您的Bitmapin onStop(),而不是 in onDestroy()

onPause()/onResume()

此外,更好的做法是释放资源,onPause()然后在相应的方法中重新创建它们onResume()

inSampleSize 和 OutOfMemoryError

您还应该确保使用BitmapFactory.Options.inSampleSizeBitmap打开尽可能小的图像,以减少收到. 该站点上有许多示例演示了. 这只是其中之一:根据 textivew 的大小调整图片大小OutOfMemoryErrorinSampleSize

安卓活动生命周期

Android 活动生命周期

于 2013-04-26T19:44:55.740 回答